當前位置:首頁 » 文件傳輸 » ftp連接對象多次調用
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

ftp連接對象多次調用

發布時間: 2023-02-04 02:49:28

㈠ ftp遍歷目錄的問題

你這個ftp是用的都是同一個對象,每次遞歸workfolder都被update掉了。。。。當然會不繼續遍歷,改成每次都Generate一個New的ftp吧。
補充:
本來你ftp指向目錄A,後來進入遞歸被改成指向A/B了,你說遍歷還能准確嗎?
還有個方法就是每次遞歸回來調用:
ftp.changeWorkingDirectory(ftpPath);
把Path給設置回來。不過不確定這個方法穩定,可以先Try一下。
public void listFilesDir(String path) throws IOException{
String ftpPath = path;
ftp.changeWorkingDirectory(ftpPath);
FTPFile[] files = ftp.listFiles();
for(FTPFile ff:files){
if(!ff.isDirectory()){
System.out.println("文件:" + ff.getName());
}
else{
if(!ff.getName().startsWith(".")){
ftpPath = ff.getName() + "/";
System.out.println("目錄 " + ff.getName() + " 下的文件文件或目錄:");
ftp.changeWorkingDirectory(ftpPath);
listFilesDir(ftpPath);
ftp.changeWorkingDirectory(path);
}
}
}
}
再補充:
中文的話試試看用GBK。。。Java項目的編碼記得也要一樣的。

㈡ 怎麼虛擬多用戶同時訪問ftp伺服器

高質屏和好師傅,解救你的碎屏機

建立各個用戶的賬戶:ftp-lwt,ftp-xyz,都放到一個用戶組裡面:FTP Users。
建立FTP用的文件夾:direct-link,下面給每個用戶分別建立文件夾,lwt和xyz。
direct-link給予FTP用戶組的讀取許可權:

各個用戶文件夾都做一樣的設置,以lwt為例:先取消:包括可從該對象的父項繼承的許可權 這個選項,確認後就會把所有從父文件夾繼承下來的許可權全部取消掉。這樣做是為了取消Users用戶組的許可權,從而取消了其他FTP用戶的訪問權利。
然後加上ftp-lwt的完全控制(似乎還是要加上administrator,system,owner這幾位老大的許可權),並勾選 使用可從此對象繼承的許可權替換所有子對象許可權,這樣就使得lwt文件夾下面的各級子文件夾、子文件都能得到用戶的完全控制。
這樣就可以了,各個用戶都能用FTP訪問自己的文件夾,讀取,建立和刪除文件,而不能訪問別人的文件夾。

㈢ 怎樣利用WinInet技術開發FTP客戶端程序

摘要:WinInet是微軟MFC類庫提供的Win32Internet擴展介面,利用WinInet開發人員可以方便地編寫出Internet客戶端程序。本文主要闡述利用WinInet在VC 2005中實現FTP客戶端程序的方法。相對於通常採用的IE瀏覽器,本FTP客戶端程序更加安全可靠。

關鍵詞:MFC;WinInet;FTP客戶端程序;VC 2005

一、WinInet概述

為了開發Internet客戶端程序,微軟的MFC類庫提供了專門的Win32Internet擴展介面,即WinInet。WinInet提供了Internet會話類CInternetSession、Internet連接類CInternetConnection、Internet文件類CInternetFile、Internet文件操作類CFileFind、Internet通用異常類CInternetException等類。WinInet為HTTP、FTP和Gopher提供了統一的函數集,用戶使用這些類可以大大簡化針對HTTP、FTP等協議的編程,特別是客戶端的編程。

二、建立FTP客戶端程序的步驟

FTP客戶端程序首先要建立與伺服器的連接,這需要一個CInternetSession和CFtpConnection對象,但並不需要直接創建CFtpConnection對象,而是通過調用CInternetSession::GetFtpConnection來實現;然後通知FTP伺服器改變目錄到當前服務目錄,通過CFtpConnection::SetCurrentDirectory實現;讀寫伺服器中的數據,必須創建一個CFtpFileFind的實例;找到第一個文件,如果文件沒找到返回FALSE,通過CFtpFileFind::FindFile實現;循環找下一個文件,如果文件沒找到返回FALSE,通過CFtpFileFind::FindNextFile實現;最後打開找到的文件進行相應的操作。

三、建立FTP客戶端程序的實例

1.功能描述

本FTP客戶端程序實現如下功能:通過用戶名、密碼(只要是合法的用戶名、密碼均可)登錄到指定的FTP伺服器,在文件列表框中列出FTP伺服器當前目錄所在的文件和目錄,然後以「另存為」對話框實現對選定文件的下載功能。

2.設計

(1)在VisualStudio2005創建一個名為FTPClient項目

項目類型:開發語言為VisualC 的基於對話框的MFC應用程序,設計對話框模板如圖1所示。

圖1FTPClient對話框模板

(2)為各控制項添加變數

為「FTP伺服器地址」文本框添加Cstring類型的變數m_strFTPServer;為「埠」文本框添加UINT類型的變數m_nFTPPort;為「用戶名」文本框添加Cstring類型的變數m_strUserName;為「密碼」文本框添加Cstring類型的變數m_strPassword,其Password屬性為TRUE;為「下載目錄」文本框添加Cstring類型的變數m_strFTPDirectory;為「下載目錄文件列表」列表框控制項添加CListBox類型的變數m_listFiles;為「連接」按鈕添加Cbutton類型的變數m_bnConnect;為「下載文件」按鈕添加Cbutton類型的變數m_bnDownloadFile。

3.實現

(1)建立與FTP伺服器的連接

為此需要在對話框類(FTPClientDlg.h)中添加CInternetSession類的對象m_Session和CFtpConnection對象指針m_pConnection兩個變數。為使程序可使用WinInet類,需要在stdafx.h中加入一個對afxinet.h和afx.h的包含。建立連接主要是通過單擊對話框中的「連接」按鈕來實現的(調用FTPClientDlg.cpp中的CFTPClientDlg::OnBnClickedButtonconnect()),其代碼如下。

voidCFTPClientDlg::OnBnClickedButtonconnect()

{

UpdateData(TRUE);//從對話框中獲取數據

if(!m_pConnection)//進行連接

{

if(m_strFTPServer!="")

{

//利用Internet對話對象m_Session打開一個FTP連接

m_pConnection=m_Session.GetFtpConnection(m_strFTPServer,m_strUserName,m_strPassword,m_nFTPPort);

if(m_pConnection)

{

//如果連接成功,則獲取當前目錄

m_pConnection->GetCurrentDirectory(m_strFTPDirectory);

//將「連接」按鈕改為「斷開連接」按鈕

m_bnConnect.SetWindowText(_T("斷開連接"));

LoadListofFtpFiles();//獲取文件列表

//FTP已連接,「下載文件」按鈕使能

m_bnDownloadFile.EnableWindow(TRUE);

UpdateData(FALSE);//更新對話框數據

}

}

}

else//斷開連接

{

m_pConnection->Close();//斷開連接並刪除連接對象

deletem_pConnection;

m_pConnection=NULL;//重置連接對象指針為NULL

//將「斷開連接」按鈕改為「連接」按鈕

m_bnConnect.SetWindowText(_T("連接"));

m_strFTPDirectory="";//重置目錄

m_listFiles.ResetContent();//清空列表框

//FTP斷開連接,「下載文件」按鈕Disable

m_bnDownloadFile.EnableWindow(FALSE);

UpdateData(FALSE);//更新對話框數據

}

}

BOOLCFTPClientDlg::OnInitDialog()

{

Cdialog::OnInitDialog();

…//省略原有代碼

//TODO:在此添加額外的初始化代碼

//設置默認的FTP伺服器名(IP)、埠、用戶名(匿名)和登錄密碼,目錄

m_strFTPServer=_T("192.168.0.1");//設置FTP的IP

m_nFTPPort=21;//設置FTP埠:默認的埠是21

m_strUserName=_T("user1");//設置登錄用戶名,默認的是匿名:user1

m_strPassword=_T("user1");//設置登錄密碼:user1

m_listFiles.ResetContent();//清空文件目錄列表

m_pConnection=NULL;//初始狀態FTP未連接,FTP連接類的指針變數初始化為空

//FTP未連接,「下載文件」按鈕Disable

m_bnDownloadFile.EnableWindow(FALSE);

UpdateData(FALSE);//交換數據,對話框顯示初始化內容

returnTRUE;//除非將焦點設置到控制項,否則返回TRUE

}

voidCFTPClientDlg::OnClose()

{

m_Session.Close();//在對話框關閉時關閉Internet連接

Cdialog::OnClose();

}

(2)讀FTP伺服器中的文件和目錄到列表框中

該功能是通過FTPClientDlg.cpp中的CFTPClientDlg::LoadListofFtpFiles(void)來實現的,其代碼如下。

voidCFTPClientDlg::LoadListofFtpFiles(void)

{

m_listFiles.ResetContent();//清空列表框

//構建一個FTP文件操作類對象,同時把FTP連接指針傳遞給該對象,

//打開一個文件查找對話

CFtpFileFindfFiles(m_pConnection);

CstringstrFileName;//用來保存文件名

BOOLbMoreFiles;//用來設置文件搜索狀態

//利用默認的方法找到第一個文件,同時找到文件列表

bMoreFiles=fFiles.FindFile(NULL);

while(bMoreFiles)//文件搜索,直到最後一個文件

{

bMoreFiles=fFiles.FindNextFile();//查找下一個文件

strFileName=fFiles.GetFileName();//獲取該文件名

if(fFiles.IsDirectory())//若為目錄,則在名後加一個標志

strFileName ="<DIR>";

m_listFiles.AddString(strFileName);//將文件名添加到列表框中

}

fFiles.Close();//關閉文件查找對話框

}

(3)下載FTP伺服器中的文件

下載文件是通過單擊對話框中的「下載文件」按鈕來實現的(調用FTPClientDlg.cpp中的CFTPClientDlg::OnBnClickedButtondownloadfile()),其具體實現是利用CFileDialog的保存功能來完成文件下載的,其主要代碼如下。

voidCFTPClientDlg::OnBnClickedButtondownloadfile()

{

UpdateData(TRUE);//從對話框中獲取數據

m_listFiles.GetText(m_listFiles.GetCurSel(),m_strFile);

//將列表框選中的項的值賦給m_strFile(選中的文件或目錄)

if(m_strFile!="")

{

if(m_strFile.Right(5)=="<DIR>")//判斷用戶選擇的是否目錄

MessageBox(_T("無法下載目錄!"));//如果是目錄,報錯

else

{

//打開文件對話框,詢問下載位置

CFileDialogfiledlg(FALSE,NULL,m_strFile);

if(filedlg.DoModal()==IDOK)

{

//確定地址後開始下載文件

if(!m_pConnection->GetFile(m_strFile,filedlg.GetFileName()))

MessageBox(_T("無法下載文件!"));//下載出錯

else

MessageBox(_T("文件下載完畢!"));//下載成功

}

}

}

}

4.最終實現界面,如圖2所示。

圖2程序運行界面

四、結束語

只要安裝.NET2.0且FTP伺服器能提供正常的服務,本客戶端程序可以運行在WindowsXP(SP2)、Windows2000pro/server下。若FTP伺服器沒有正常運行,則無法連接,提示:「與伺服器的連接被重置」。利用WinInet不僅可以實現FTP客戶端程序,還可以方便地編寫HTTP等其它客戶端程序。

參考文獻:

[1]VisualC#.NET面向程序設計教程趙衛偉機械工業出版社2006年5月第1版

[2]VisualC .NET應用編程150例王興晶電子工業出版社2003年8月第1版

[3]MSDN(msdn.microsoft.com)

Tags:
發布:crazyapple

㈣ JAVA編寫FTP連接報錯java.net.ConnectException: Connection refused: connect FTP

你用的FTPClient引入不對吧,我們項目上都是用的

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

下面是我們項目上用到的FTP的實現代碼(FTP需要先連接,再登錄,之後就是校驗登錄是否成功),具體代碼如下:

/**
*獲取FTPClient對象
*
*@paramftpHostFTP主機伺服器
*@paramftpPasswordFTP登錄密碼
*@paramftpUserNameFTP登錄用戶名
*@paramftpPortFTP埠默認為21
*@returnFTPClient
*@throwsException
*/
(StringftpHost,StringftpUserName,
StringftpPassword,intftpPort)throwsException{
try{
FTPClientftpClient=newFTPClient();
ftpClient.connect(ftpHost,ftpPort);//連接FTP伺服器
ftpClient.login(ftpUserName,ftpPassword);//登陸FTP伺服器
if(!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){
logger.error("未連接到FTP,用戶名或密碼錯誤!");
ftpClient.disconnect();
returnnull;
}else{
logger.info("FTP連接成功!");
returnftpClient;
}
}catch(){
logger.error("FTP的IP地址可能錯誤,請正確配置!");
throwsocketException;
}catch(IOExceptionioException){
logger.error("FTP的埠錯誤,請正確配置!");
throwioException;
}
}

㈤ 請高手介紹一下ftp的主動連接和被動連接

自己看,不用加分,其實就是協商的過程,很容易理解.
http://www.lovim.com/dbbs/redirect.php?tid=7&goto=lastpost

ftp的兩種連接模式PASV(被動)和PORT(主動)

FTP基礎知識 FTP是File Transfer Protocol(文件傳輸協議)的縮寫,用來在兩台計算機之間互相傳送文件。相比於HTTP,FTP協議要復雜得多。復雜的原因,是因為FTP協議要用到兩個TCP連接,一個是命令鏈路,用來在FTP客戶端與伺服器之間傳遞命令;另一個是數據鏈路,用來上傳或下載數據。 FTP協議有兩種工作方式:PORT方式和PASV方式,中文意思為主動式和被動式。 Port模式:ftp server:tcp 21 <------client:dynamicftp server:tcp 20 ------>client:dynamic Pasv模式:ftp server:tcp 21 <----client:dynamicftp server:tcp dynamic <----client:dynamic PORT(主動)方式的連接過程是:客戶端向伺服器的FTP埠(默認是21)發送連接請求,伺服器接受連接,建立一條命令鏈路。當需要傳送數據時,客戶端在命令鏈路上用PORT命令告訴伺服器:「我打開了XXXX埠,你過來連接我」。於是伺服器從20埠向客戶端的XXXX埠發送連接請求,建立一條數據鏈路來傳送數據。 PASV(被動)方式的連接過程是:客戶端向伺服器的FTP埠(默認是21)發送連接請求,伺服器接受連接,建立一條命令鏈路。當需要傳送數據時,伺服器在命令鏈路上用PASV命令告訴客戶端:「我打開了XXXX埠,你過來連接我」。於是客戶端向伺服器的XXXX埠發送連接請求,建立一條數據鏈路來傳送數據。 從上面可以看出,兩種方式的命令鏈路連接方法是一樣的,而數據鏈路的建立方法就完全不同。而FTP的復雜性就在於此。