Есть ли эффективный способ проверить наличие файла на FTP-сервере? Я использую Apache Commons Net. Я знаю, что я могу использовать метод listNames
FTPClient
, чтобы получить все файлы в определенном каталоге, а затем я могу просмотреть этот список, чтобы проверить, существует ли данный файл, но я не считаю его эффективным, особенно когда сервер содержит много файлов.
Проверка существования файла на FTP-сервере
Ответ 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");