diff --git a/source/net/filebot/util/FileUtilities.java b/source/net/filebot/util/FileUtilities.java index 1694687d..b237ea77 100644 --- a/source/net/filebot/util/FileUtilities.java +++ b/source/net/filebot/util/FileUtilities.java @@ -47,6 +47,7 @@ import java.util.TreeMap; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Stream; import org.apache.commons.io.FileUtils; @@ -476,13 +477,13 @@ public final class FileUtilities { public static List listFiles(Iterable folders, int depth, FileFilter filter, Comparator order) { List sink = new ArrayList(); - for (File it : folders) { - if (it.isDirectory()) { - listFiles(it, sink, depth, filter, order); + for (File f : folders) { + if (f.isDirectory()) { + listFiles(f, sink, depth, filter, order); } - if (filter.accept(it)) { - sink.add(it); + if (filter.accept(f)) { + sink.add(f); } } @@ -494,14 +495,25 @@ public final class FileUtilities { return; } - for (File it : getChildren(folder, NOT_HIDDEN, order)) { - if (it.isDirectory()) { - listFiles(it, sink, depth - 1, filter, order); - } + // children array may be null if folder permissions do not allow listing of files + File[] files = folder.listFiles(NOT_HIDDEN); - if (filter.accept(it)) { - sink.add(it); - } + // traverse file tree recursively + streamFiles(files, FOLDERS, order).forEach(f -> listFiles(f, sink, depth - 1, filter, order)); + + // add selected files in preferred order + streamFiles(files, filter, order).forEach(sink::add); + } + + private static Stream streamFiles(File[] files, FileFilter filter, Comparator order) { + if (files == null || files.length == 0) { + return Stream.empty(); + } + + if (order == null) { + return stream(files).filter(filter::accept); + } else { + return stream(files).filter(filter::accept).sorted(order); } }