java里使用ftpClient的被动方式访问ftp服务器读取一系列文件夹,只有第一个内容能读到,其他读不到?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java里使用ftpClient的被动方式访问ftp服务器读取一系列文件夹,只有第一个内容能读到,其他读不到?相关的知识,希望对你有一定的参考价值。

要读取的内容是一个文件夹下的n个子文件夹,每个子文件夹中只有一个文件。
删除了没有用的内容后的代码如下:
……(之前定义了一个ftpClient)
ftpClient.enterLocalActiveMode();
ftpClient.changeWorkingDirectory(basePath);
FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile file : ftpFiles)
//读取文件
FTPFile[] subFiles =ftpClient.listFiles();
for (FTPFile subFile : subFiles)
……(具体的处理过程)

……(删除file 文件夹与其中的文件)


现在的效果是,第一个子文件夹能正常处理。但是删除了第一个子文件夹后,所有的subFiles获得的都是空,再也不能处理其他文件。
题目说错了,是主动模式。

你basePath应该有问题,basePath应该指向要删除目录的上一级目录.追问

无论怎样设置工作目录,第二次和之后读取时打印出的工作目录都是null

追答

比如你的路径是ftp:192.168.1.1:40/a/;你要检查a下的文件夹里是否存在文件,那么你首先获取到的是a文件夹下的文件夹,然后你的路径应该是ftp:192.168.1.1:40/a/文件夹1/isFile这样判断.

追问

每次删除了一个文件夹,我的程序都会重新设定工作目录,但是设置后还会出现路径为空的问题。
现在问题的关键已经找到了,是主被动与completepending匹配的问题。

参考技术A 楼主 你是怎么解决的哈 我也遇到这样的情况了

FTPClient上传文件大小为0问题

FTP支持两种模式,一种方式叫做Standard主动方式,缺省时默认的方式,一种是 Passive 被动方式。?

下面介绍一个这两种方式的工作原理:

  • 主动模式:第一步FTP客户端首先随机选择一个大于1024的端口p1,并通过此端口发送请求连接到FTP服务器的21号端口建立TCP连接,在FTP中这个连接叫做控制连接,连接成功建立后,FTP客户端会发送port命令,紧接着FTP客户端会监视自己的p1+1端口,FTP服务器接收到port命令会从自己的20号端口向FTP客户端的p1+1端口发起请求建立TCP连接,这个连接叫做数据连接,用来发送数据,数据传输完毕后数据连接随即关闭,控制连接保持开启。

  • 被动模式:在建立控制连接的时候和主动模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,FTP客户端发送请求连接FTP服务器此端口,成功建立连接后FTP服务器将通过这个端口进行数据的传送数据传输完毕后数据连接随即关闭,控制连接保持开启。

因为很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网后的FTP客户端不支持主动模式,因为服务器无法穿过防火墙或者无法连接到NAT后的客户端。

至此,找到了原因:我是用的本机上开启了防火墙,FTP服务器请求本机的端口被隔离阻止。

  • 解决方案:将ftp模式修改为Passive模式。加上如下代码即可解决上传文件大小为0的问题
ftp.enterLocalPassiveMode();

以上是关于java里使用ftpClient的被动方式访问ftp服务器读取一系列文件夹,只有第一个内容能读到,其他读不到?的主要内容,如果未能解决你的问题,请参考以下文章

2019

FTPClient上传文件大小为0问题

FTP服务器文件上传的代码实现

FTPClient连续读取文件

FtpClient上传文件速度非常慢,而且大小为0,上传失败

Java FTPClient 大量数据传输的问题(未解决)