Проверка наличия файлов на FTP-сервере

есть ли эффективный способ проверить наличие файла на FTP-сервере? Я использую Apache Commons Net. Я знаю, что могу использовать listNames метод FTPClient чтобы получить все файлы в определенном каталоге, а затем я могу перейти по этому списку, чтобы проверить, существует ли данный файл, но я не думаю, что это эффективно, особенно когда сервер содержит много файлов.

2 ответов


listFiles(String pathName) должно работать просто отлично для одного файла.


используя полный путь к файлу в 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 команда принимает путь к папку только.

действительно большинство FTP-серверов могут принимать маску файла в LIST команда (и точное имя файла тоже является своего рода маской). Но это стандарт, и не все 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");
}

более эффективным является использование mlistFile (MLST command), если сервер поддерживает его:

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

этот метод can используйте для того чтобы испытать наличие каталога.


если сервер не поддерживает вы можете сообщил getModificationTime ():

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

этот метод не может использоваться для тестирования exitence каталога.