能否用Apache Java FTP Client按时间戳列目录?调用listNames返回空列表
如何用Apache FTP Client按时间戳列出目录内容
当然可以实现按时间戳列出目录内容啦,不过你当前的写法有两个小问题导致返回空列表,咱们来一步步解决:
为什么你的mFtpClient.listNames("-t .")会返回空?
listNames的参数用途不对:这个方法的参数是要列出的路径,不是FTPLIST命令的选项。你传的-t .会被当成一个名为-t .的路径,自然找不到内容,返回空列表。- 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
相关产品推荐
相关产品推荐

