Checking file existence on FTP server

listFiles(String pathName) should work just fine for a single file.


Using a full path to a file in listFiles (or mlistDir) call, as the accepted answer shows, should indeed work:

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

The RFC 959 in the section 4.1.3 in the part about the LIST command says:

If the pathname specifies a file then the server should send current information on the file.

Though if you are going to check for many files, this will be rather ineffective. A use of the LIST command actually involves several commands, waiting for their responses, and mainly, opening a data connection. Opening a new TCP/IP connection is a costly operation, even more so, when an encryption is used (what is a must these days).

Also LIST command is even more ineffective for testing an existence of a folder, as it results in a transfer of a complete folder contents.


More efficient is to use mlistFile (MLST command), if the server supports it:

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

This method can be used to test an existence of a directory.

MLST command does not use a separate connection (contrary to LIST).


If the server does not support MLST command, you can abuse getModificationTime (MDTM command):

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

This method cannot be used to test an existence of a directory.