Метод FTPClient listFiles возвращает каталоги.Как я могу фильтровать? - PullRequest
0 голосов
/ 09 апреля 2019

Вы можете видеть, что библиотека FTPClient имеет класс FTPFileFiltersclass, который дает возможность фильтрации DIRECTORIES, NON_NULL и 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();
        }
    };

}

Проблема в том, что я пытаюсь загрузить список файлов и ТОГДА каталогов, чтобы обрабатывать их по-разному:

Из моего подключения. 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

    }
}

Из моего 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));
        }

    }

В конце я получаю список, включающий файлы и каталоги, а также каталоги снова. Я не понимаю, почему FTPClient предоставляет метод listDirectories ... и фильтр, который позволяет ... получать только каталоги. Это избыточно, и нет возможности получить только файлы. Итак, вопрос в том, в чем секрет получения только файлов?

1 Ответ

1 голос
/ 09 апреля 2019

Для фильтрации только файлов, которые вы можете использовать:

  FTPFileFilter filter = new FTPFileFilter() {

         @Override
         public boolean accept(FTPFile ftpFile) {
         return ftpFile.isFile();
        }
  };

И аналогично используйте ftpFile.isDirectory(); для фильтрации каталогов.

...