当前位置:首页 » 文件传输 » 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的复杂性就在于此。