Как получить список файлов с указанными расширениями и без нескольких каталогов? - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно вывести список файлов (указанных расширений) из каталога, исключая несколько подкаталогов.

Я могу фильтровать по расширениям, но не с двумя условиями 1) Файлы должны фильтроваться по расширению 2) Еслиисключить несколько подкаталогов

    File dir = new File("D:\\SomeDir");
    String[] extensions = new String[] { "txt", "java" };
    List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
    for (File file : files) {
        System.out.println("file: " + file.getCanonicalPath());
    }

Как исключить выбранные подкаталоги?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вот, пожалуйста,

public static void main(String[] args) throws IOException {
    File dir = new File("C:\\Users\\cosmap\\Documents\\travel-expenses");
    List<String> excludedDirs = Arrays.asList("src", ".git");
    List<String> extensions = Arrays.asList("xml", "yml");

    listFiles(dir, excludedDirs, extensions).forEach(System.out::println);
}

public static List<File> listFiles(File currentFile, List<String> excludedDirs, List<String> extensions) {
    List<File> out = new ArrayList<>();
    File[] files = currentFile.listFiles();

    // might be null
    if(files == null) {
        return out;
    }

    for (File file : files) {
        // add recursively only if is directory and not in the excluded list
        if(file.isDirectory() && !excludedDirs.contains(file.getName())) {
            out.addAll(listFiles(file, excludedDirs, extensions));
        // add if is file and in the allowed extensions list
        } else if (file.isFile() && extensions.contains(file.getName().substring(file.getName().lastIndexOf('.') + 1))) {
            out.add(file);
        }
    }

    return out;
}
0 голосов
/ 05 февраля 2019

попробуйте этот код:

// for exlude file extension  
NotFileFilter suffixFileFilterFileFilter=new NotFileFilter(new 
SuffixFileFilter(new String[] { "txt", "java" }));  

//to include only selected extension use below one
//IOFileFilter suffixFileFilterFileFilter= new SuffixFileFilter(new String[] { "java", "txt" });

NotFileFilter directoryFileFilterFileFilter=new NotFileFilter(new 
PrefixFileFilter(new String[] { "tolearn", "dir2" }));   // for directory
File dir = new File("D:\\SomeDir");
List<File> fileList  = (List<File>)  FileUtils.listFiles(dir,suffixFileFilterFileFilter,directoryFileFilterFileFilter);
    for (File file : fileList) {
        System.out.println("file: " + file.getCanonicalPath());
    }
0 голосов
/ 05 февраля 2019

Вы можете использовать FileUtils.listFilesAndDirs или другое решение: вместо того, чтобы перечислить все каталоги и исключить несколько каталогов, вы можете исключить подкаталоги в строке 3 List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, *false*); и включить во второй цикл свои подкаталоги, в которые вы хотите перечислить файлы.

...