检查 FTP 服务器上的文件是否存在

新手上路,请多包涵

有没有一种有效的方法来检查 FTP 服务器上的文件是否存在?我正在使用 Apache Commons Net。我知道我可以使用 listNames 方法 FTPClient 获取特定目录中的所有文件,然后我可以查看此列表以检查给定文件是否存在,但我不要认为它是有效的,尤其是当服务器包含大量文件时。

原文由 manash 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

listFiles(String pathName) 对于单个文件应该工作得很好。

原文由 Christopher Creutzig 发布,翻译遵循 CC BY-SA 3.0 许可协议

listFiles (或 mlistDir )调用中使用文件的完整路径,正如接受的答案所示,应该确实有效:

 String remotePath = "/remote/path/file.txt";
FTPFile[] remoteFiles = ftpClient.listFiles(remotePath);
if (remoteFiles.length > 0)
{
    System.out.println("File " + remoteFiles[0].getName() + " exists");
}
else
{
    System.out.println("File " + remotePath + " does not exists");
}

关于 LIST 命令的部分 4.1.3 节中的 RFC 959 说:

如果路径名指定了一个文件,那么服务器应该发送关于该文件的当前信息。

但是,如果您要检查很多文件,这将是相当低效的。 LIST 命令的使用实际上涉及多个命令,等待它们的响应,主要是打开数据连接。打开一个新的 TCP/IP 连接是一项代价高昂的操作,在使用加密时更是如此(如今这是必须的)。

另外 LIST 命令对于测试文件夹的存在更加无效,因为它会导致完整文件夹内容的传输。


更有效的是使用 mlistFileMLST 命令),如果服务器支持的话:

 String remotePath = "/remote/path/file.txt";
FTPFile remoteFile = ftpClient.mlistFile(remotePath);
if (remoteFile != null)
{
    System.out.println("File " + remoteFile.getName() + " exists");
}
else
{
    System.out.println("File " + remotePath + " does not exists");
}

此方法 用于测试目录是否存在。

MLST 命令不使用单独的连接(与 LIST 相反)。


如果服务器不支持 MLST 命令,你可以 滥用 getModificationTimeMDTM 命令):

 String timestamp = ftpClient.getModificationTime(remotePath);
if (timestamp != null)
{
    System.out.println("File " + remotePath + " exists");
}
else
{
    System.out.println("File " + remotePath + " does not exists");
}

此方法 不能 用于测试目录是否存在。

原文由 Martin Prikryl 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题