使用Apache FTPClient使FTP服务器返回时间戳列出的文件
我已将以下代码编写为连接到远程FTP服务器(在CentOS 6中为vsftp)。(为简便起见,此处未显示异常处理)
FTPClient ftpClient = new FTPClient();ftpClient.setConnectTimeout(20000);
ftpClient.connect(serverip);
ftpClient.enterLocalPassiveMode();
ftpClient.login(username, password);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
ftpClient.disconnect();
throw new FTPConnectionClosedException("Unable to connect to FTP server...");
}
FTPFile[] filesList = ftpClient.listFiles();
for (FTPFile tmpFile : filesList) {
if (tmpFile.isDirectory())
continue;
// processing the file
}
if (ftpClient.isConnected())
ftpClient.disconnect();
如果该FTP服务器中有100个文件,listFiles()
则将按字母顺序列出文件名。
A.txtB.txt
Z.txt
a.txt
z.txt
(即最早的文件优先)。这listFiles()
使用LIST
命令。
我已经检查了从ftp获取最新文件的问题。这种方法的问题在于,我们必须先使用a排序文件,Comparator
然后重命名并将其移动到其他文件夹(以修改顺序获取它们)。如果文件超过1000个,则对它们进行排序将成为一项耗时的操作!
编辑:
而且,检索文件并对文件进行排序还有另一个问题。使用seconds
时没有任何信息ftpFile.getTimestamp()
。它仅精确到分钟。
回答:
没有标准的方法让FTP服务器根据您(或任何)标准对文件进行排序。
尽管某些FTP服务器(尤其是ProFTPD和vsftpd)通过LIST
命令对条目进行排序支持专有标志。
这两个服务器都支持该-t
标志,以按修改时间对文件进行排序:
LIST -t
尽管这不仅是非标准的,但实际上违反了FTP协议。
- 有关ProFTPD支持的所有选项,请参见其手册页:http
- //www.proftpd.org/docs/directives/linked/config_ref_ListOptions.html
需要注意的是vsftpd的仅支持-a
,-r
,-t
,-F
并-l
与含义的ProFTPD相同。
Apache Commons Net没有API向LIST
命令添加标志(唯一的例外,与该问题无关,是-a
标志-
FTPClient.setListHiddenFiles
设置时发送)。
您必须重写FTPClient.getListArguments
来插入自己的标志。
再次说明,我看不出使用Comparator
文件排序有什么问题。只需确保使用FTPClient.mlistDir()
,它在内部使用现代MLSD
命令。这样,您将获得精确的时间戳,而不是分钟的-
或更糟的精确时间戳(如过时的LIST
-)FTPClient.listFiles()
。
FTPFile[] remoteFiles = ftpClient.mlistDir(remotePath);Arrays.sort(remoteFiles,
Comparator.comparing((FTPFile remoteFile) -> remoteFile.getTimestamp()).reversed());
但是,正如您所评论的,vsftpd不支持MLSD
(ProFTPD 支持)。在那种情况下,这LIST
-t确实是获取精确排序文件的唯一有效方法(尽管这不是标准/便携式方法)。对于每个列出的文件,耗时的调用MDTM
-
除外FTPClient.getModificationTime
。如果没有精确的时间戳,可以执行与上面相同的代码,但是FTPClient.listFiles()
可以。
以上是 使用Apache FTPClient使FTP服务器返回时间戳列出的文件 的全部内容, 来源链接: utcz.com/qa/398734.html