gpt4 book ai didi

java - 使用 Apache FTPClient 使 FTP 服务器返回按时间戳列出的文件

转载 作者:行者123 更新时间:2023-11-30 06:54:45 25 4
gpt4 key购买 nike

我在下面编写了这段代码来连接到远程 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 命令。 是否有任何其他命令可以根据修改时间列出文件。?由于这是一个 Linux 服务器,我们可以发送一些 Linux 命令来实现吗?

我已经检查了问题get latest file from ftp .这种方法的问题是我们必须使用 Comparator 对文件进行排序,然后重命名并将其移动到不同的文件夹(以修改顺序获取它们)。如果超过1000个文件,排序将成为一个耗时的操作!

编辑:
而且,检索文件并对它们进行排序还有另一个问题。当使用 ftpFile.getTimestamp() 时,它没有 seconds 信息。仅精确到分钟。

最佳答案

没有标准的方法可以让 FTP 服务器根据您的(或任何)标准对文件进行排序。

虽然一些 FTP 服务器,特别是 ProFTPD 和 vsftpd,支持使用 LIST 命令对条目进行排序的专有标志。

这两个服务器都支持 -t 标志来按修改时间对文件进行排序:

LIST -t

虽然这不仅不规范,而且实际上违反了FTP协议(protocol)。

有关 ProFTPD 支持的所有选项,请参阅其手册页:
http://www.proftpd.org/docs/howto/ListOptions.html

请注意,vsftpd 仅支持 -a-r-t-F-l 同ProFTPD含义。

Apache Commons Net 没有 API 可以向 LIST 命令添加标志(唯一的异常(exception),虽然与这个问题无关,是 -a 标志 - 这是当设置 FTPClient.setListHiddenFiles 时发送。

您必须覆盖 FTPClient.getListArguments注入(inject)你自己的标志。


尽管如此,我还是看不出使用 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() 就可以了。

另见 Fetching last modified date of a file in FTP server using FTPClient.getModificationTime yields null .

关于java - 使用 Apache FTPClient 使 FTP 服务器返回按时间戳列出的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com