使用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.txt

B.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

回到顶部