Посетите только каталоги определенной глубины с Java 7

При использовании метода

java.nio.file.Files.walkFileTree(корневой путь, параметры настройки, int maxDepth, посетитель FileVisitor)

Можно указать максимальную глубину файлов для посещения. Есть ли способ указать, что должны быть посещены только пути определенной, точной глубины?

Более конкретно, я хочу посещать только каталоги, но это можно легко проверить с помощью

if (attrs.isDirectory()) {
    // do something
}

в visitFile Перезвоните.


Пример: Предположим, у меня есть структура каталогов с файлами root/dir1/dir11/file.a а также root/dir2/file.b и я звоню walkFileTree на root с maxDepth=2, Тогда я хочу только обработать

root/dir1/dir11

Я тоже не хочу обрабатывать файл root/dir2/file.b, который также имеет глубину два, и другие пути к каталогам с глубиной меньше двух:

root
root/dir1
root/dir2

1 ответ

Решение

Интересно, что наивная реализация делает именно то, что я хочу:

Files.walkFileTree(root, EnumSet.noneOf(FileVisitOption.class), 2, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
        if (attrs.isDirectory()) {
            process(path);
        }
        return FileVisitResult.CONTINUE;
    }
});

То есть, для данного примера, он будет только обрабатывать root/dir1/dir11,

Решение использует явно противоречивый подход для фильтрации каталогов вфайлах посещений. Однако JavaDoc walkFileTree объясняет, почему это приводит к желаемому поведению:

Для каждого обнаруженного файла этот метод пытается прочитать его java.nio.file.attribute.BasicFileAttributes. Если файл не является каталогом, то метод visitFile вызывается с атрибутами файла. (...)

Параметр maxDepth - это максимальное количество уровней каталогов, которые нужно посетить. (...) Метод visitFile вызывается для всех файлов, включая каталоги, встречающиеся в maxDepth (...)

Другие вопросы по тегам