You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用Apache Java FTP Client按时间戳列目录?调用listNames返回空列表

如何用Apache FTP Client按时间戳列出目录内容

当然可以实现按时间戳列出目录内容啦,不过你当前的写法有两个小问题导致返回空列表,咱们来一步步解决:

为什么你的mFtpClient.listNames("-t .")会返回空?

  1. listNames的参数用途不对:这个方法的参数是要列出的路径,不是FTP LIST命令的选项。你传的-t .会被当成一个名为-t .的路径,自然找不到内容,返回空列表。
  2. Filezilla Server不支持Unix风格的-t参数:即使你用正确的方式传递LIST命令选项,Filezilla Server默认也不识别Unix FTP常用的-t(按时间排序)参数,这也是导致无返回的原因之一。

正确的实现方式

推荐两种方案,优先选第一种(更可靠):

方案1:本地获取文件后按时间戳排序

这种方式不依赖服务器的排序支持,兼容性更好:

// 先确保FTP客户端适配Filezilla Server的文件格式
FTPClientConfig config = new FTPClientConfig(FTPClientConfig.SYST_NT);
mFtpClient.configure(config);

// 获取当前目录的完整文件信息(包含时间戳)
FTPFile[] files = mFtpClient.listFiles();

// 按修改时间降序排序(最新文件在前)
Arrays.sort(files, (file1, file2) -> 
    Long.compare(file2.getTimestamp().getTimeInMillis(), file1.getTimestamp().getTimeInMillis())
);

// 遍历输出结果
for (FTPFile file : files) {
    System.out.printf("文件名:%s,修改时间戳:%d%n", file.getName(), file.getTimestamp().getTimeInMillis());
}

方案2:尝试用Filezilla Server支持的服务器端排序参数

如果想让服务器直接返回排序后的结果,可以试试Windows FTP风格的排序参数/O:D(按日期降序),不过这个取决于你的Filezilla Server配置:

// 传递排序参数给LIST命令,获取已排序的文件列表
FTPFile[] sortedFiles = mFtpClient.listFiles("/O:D");

小提示

  • listNames方法只能返回纯文件名,无法获取时间戳信息,如果你需要时间戳,一定要用listFiles方法,它会返回包含完整元数据的FTPFile对象。
  • 提前用mFtpClient.getSystemType()查看服务器返回的系统类型,对应设置FTPClientConfig,能避免文件解析错误。

内容的提问来源于stack exchange,提问作者Federico Ponzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:38:35