Search code examples
javaftp-client

FTPClient listFiles method is returning directories. How can I filter?


You can see FTPClient library has FTPFileFiltersclass which gives the option of filtering DIRECTORIES, NON_NULL and ALL

public class FTPFileFilters {
    /**
     * Accepts all FTPFile entries, including null.
     */
    public static final FTPFileFilter ALL = new FTPFileFilter() {
        @Override
        public boolean accept(FTPFile file) {
            return true;
        }
    };

    /**
     * Accepts all non-null FTPFile entries.
     */
    public static final FTPFileFilter NON_NULL = new FTPFileFilter() {
        @Override
        public boolean accept(FTPFile file) {
            return file != null;
        }
    };

    /**
     * Accepts all (non-null) FTPFile directory entries.
     */
    public static final FTPFileFilter DIRECTORIES = new FTPFileFilter() {
        @Override
        public boolean accept(FTPFile file) {
            return file != null && file.isDirectory();
        }
    };

}

The problem is, I'm trying to download a list of files and THEN directories so I can handle them differently:

From my Connection.java:

// Download FTPFile[] of files and FTPFile[] of directories
// and give them to FileData for parsing and storage
public void downloadDirectory(String directory) {

    try {

        client.setFileType(FTP.BINARY_FILE_TYPE);

        // Copy the files into the FileData list. If directory null, its assumed to be ftp user root Todo really?
        FileData.getInstance().loadDirectoryContents(
                client.listFiles(directory /*, !FTPFileFilters.DIRECTORIES   Todo doesnt work*/),
                client.listDirectories());

    } catch (IOException e) {// Handle Todo

    }
}

From my FileData.java:

public void loadDirectoryContents(FTPFile[] ftpFiles, FTPFile[] ftpDirectories){

        removeAllFiles();   // Clear remoteFiles list


        // Get
        for(int i =0; i< ftpFiles.length; i++){

            addRemoteFile(new RemoteFile(
                    ftpFiles[i].getName(),
                    ftpFiles[i].getLink(),
                    DateTimeManagement.toLocalDateTime(ftpFiles[i].getTimestamp()),
                    null,
                    false));
        }
        for(int i =0; i< ftpDirectories.length; i++){

            addRemoteFile(new RemoteFile(
                    "./" + ftpDirectories[i].getName(),
                    ftpDirectories[i].getLink(),
                    DateTimeManagement.toLocalDateTime(ftpDirectories[i].getTimestamp()),
                    null,
                    true));
        }

    }

In the end, I get a list including the files and the directories PLUS the directories again. I don't understand why FTPClient provide a listDirectories method... and a Filter that allows you to...get only directories. It's redundent and there's no way to get only files. So the question is, what's the secret to getting files only?


Solution

  • To filter only files you can use:

      FTPFileFilter filter = new FTPFileFilter() {
    
             @Override
             public boolean accept(FTPFile ftpFile) {
             return ftpFile.isFile();
            }
      };
    

    And similarly use ftpFile.isDirectory(); to filter dirs.