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

时间:2012-05-07 12:36:41

标签: java ftp apache-commons-net

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

3 个答案:

答案 0 :(得分:20)

listFiles(String pathName)对于单个文件应该可以正常工作。

答案 1 :(得分:9)

使用listFiles(或mlistDir)调用中文件的完整路径,如接受的答案所示,确实适用于许多 FTP服务器:

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");
}

但它实际上违反了FTP规范,因为它映射到FTP命令

LIST /remote/path/file.txt

根据规范,FTP LIST命令仅接受文件夹的路径。

确实most FTP servers can accept a file mask in the LIST command(确切的文件名也是一种掩码)。但这超出了标准,并非所有FTP服务器都支持它(理所当然)。

适用于任何FTP服务器的可移植代码必须在本地过滤文件:

FTPFile[] remoteFiles = ftpClient.listFiles("/remote/path");

Optional<FTPFile> remoteFile =
    Arrays.stream(remoteFiles).filter(
        (FTPFile remoteFile2) -> remoteFile2.getName().equals("file.txt")).findFirst();
if (remoteFile.isPresent())
{
    System.out.println("File " + remoteFile.get().getName() + " exists");
}
else
{
    System.out.println("File does not exists");
}

如果服务器支持,则效率更高的是使用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命令,您可以滥用 getModificationTimeMDTM命令):

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

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

答案 2 :(得分:0)

接受的答案对我不起作用。

代码不起作用:

String remotePath = "/remote/path/file.txt";
FTPFile[] remoteFiles = ftpClient.listFiles(remotePath);

相反,这对我有用:

ftpClient.changeWorkingDirectory("/remote/path");
FTPFile[] remoteFiles = ftpClient.listFiles("file.txt");