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