有没有一种有效的方法来检查 FTP 服务器上的文件是否存在?我正在使用 Apache Commons Net。我知道我可以使用 listNames
方法 FTPClient
获取特定目录中的所有文件,然后我可以查看此列表以检查给定文件是否存在,但我不要认为它是有效的,尤其是当服务器包含大量文件时。
原文由 manash 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有一种有效的方法来检查 FTP 服务器上的文件是否存在?我正在使用 Apache Commons Net。我知道我可以使用 listNames
方法 FTPClient
获取特定目录中的所有文件,然后我可以查看此列表以检查给定文件是否存在,但我不要认为它是有效的,尤其是当服务器包含大量文件时。
原文由 manash 发布,翻译遵循 CC BY-SA 4.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
命令对于测试文件夹的存在更加无效,因为它会导致完整文件夹内容的传输。
更有效的是使用 mlistFile
( MLST
命令),如果服务器支持的话:
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
命令,你可以 滥用 getModificationTime
( MDTM
命令):
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 许可协议
8 回答6.8k 阅读
4 回答1k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
4 回答551 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
1 回答2.9k 阅读
2 回答653 阅读✓ 已解决
listFiles(String pathName)
对于单个文件应该工作得很好。