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?
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.