㈠ 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的復雜性就在於此。