使用 Apache FTPClient 按时间戳列出 FTP 服务器 return 文件
Make FTP server return files listed by timestamp with Apache FTPClient
我在下面编写了这段代码以连接到远程 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 协议。
有关 ProFTPD 支持的所有选项,请参阅其手册页:
http://www.proftpd.org/docs/howto/ListOptions.html
注意vsftpd只支持-a
, -r
, -t
, -F
and -l
同ProFTP D.
Apache Commons Net 没有 API 向 LIST
命令添加标志(唯一的例外,虽然与这个问题无关,是 -a
标志 - 它被发送当设置 FTPClient.setListHiddenFiles
时)。
您必须覆盖 FTPClient.getListArguments
才能注入您自己的标志。
尽管如此,我还是看不出使用 Comparator
to sort the files. Just make sure you use FTPClient.mlistDir()
, which internally uses a modern MLSD
command. This way you get precise timestamps, not minute- or worse precision timestamps like with obsolete LIST
- FTPClient.listFiles()
有什么问题。
FTPFile[] remoteFiles = ftpClient.mlistDir(remotePath);
Arrays.sort(remoteFiles,
Comparator.comparing((FTPFile remoteFile) -> remoteFile.getTimestamp())
.reversed());
不过,正如您所说,vsftpd 不支持 MLSD
(ProFTPD 支持)。在那种情况下,LIST -t
确实是获得精确排序文件的唯一有效方法(尽管同样不是 standard/portable)。除了为每个列出的文件耗时调用 MDTM
- FTPClient.getModificationTime
之外。如果您可以在没有精确时间戳的情况下做到这一点,则使用与上面相同的代码,但使用 FTPClient.listFiles()
即可。
另见 。
我在下面编写了这段代码以连接到远程 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 协议。
有关 ProFTPD 支持的所有选项,请参阅其手册页:
http://www.proftpd.org/docs/howto/ListOptions.html
注意vsftpd只支持-a
, -r
, -t
, -F
and -l
同ProFTP D.
Apache Commons Net 没有 API 向 LIST
命令添加标志(唯一的例外,虽然与这个问题无关,是 -a
标志 - 它被发送当设置 FTPClient.setListHiddenFiles
时)。
您必须覆盖 FTPClient.getListArguments
才能注入您自己的标志。
尽管如此,我还是看不出使用 Comparator
to sort the files. Just make sure you use FTPClient.mlistDir()
, which internally uses a modern MLSD
command. This way you get precise timestamps, not minute- or worse precision timestamps like with obsolete LIST
- FTPClient.listFiles()
有什么问题。
FTPFile[] remoteFiles = ftpClient.mlistDir(remotePath);
Arrays.sort(remoteFiles,
Comparator.comparing((FTPFile remoteFile) -> remoteFile.getTimestamp())
.reversed());
不过,正如您所说,vsftpd 不支持 MLSD
(ProFTPD 支持)。在那种情况下,LIST -t
确实是获得精确排序文件的唯一有效方法(尽管同样不是 standard/portable)。除了为每个列出的文件耗时调用 MDTM
- FTPClient.getModificationTime
之外。如果您可以在没有精确时间戳的情况下做到这一点,则使用与上面相同的代码,但使用 FTPClient.listFiles()
即可。
另见