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

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

Ответ 1

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

Ответ 2

Использование полного пути к файлу в 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");
}

RFC 959 в разделе 4.1.3 в части о команде LIST гласит:

Если путь указывает файл, то сервер должен отправить текущую информацию о файле.

Хотя, если вы собираетесь проверять множество файлов, это будет довольно неэффективно. Использование команды 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");
}

Этот метод нельзя использовать для проверки существования каталога.

Ответ 3

Принятый ответ не работал для меня.

Код не работал:

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

Вместо этого это работает для меня:

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