Поиск подкаталогов, соответствующих заданному имени - PullRequest
0 голосов
/ 28 февраля 2011

Мне нужно найти каталоги с заданным именем (я назову его «fixedname») в корневом каталоге. У меня следующая структура каталогов:

- rootdir
-- someName1
--- fixedName
-- somename2
--- fixedName

Под корневым каталогом есть некоторые каталоги, имя которых неизвестно, а под этими каталогами - мои целевые каталоги. Результат моего "поиска" должен быть следующим: [rootDir / someName1 / fixedName, rootDir / someName2 / fixedName]

Я пытался использовать Commons FileUtils , в частности, метод listfiles , делая следующее:

final File ROOTDIR = new File("/rootdir");
IOFileFilter nameFilter = new NameFileFilter("fixedName");
Collection<File> files = FileUtils.listFiles(ROOTDIR, TrueFileFilter.TRUE, nameFilter);

но это не работает, так как обход subdir останавливается на уровне директорий someName *. Я мог бы написать собственный метод, но мне было интересно, можно ли добиться того, что мне нужно, используя Commons FileUtils или Java API (я имею в виду некоторую высокоуровневую функцию, я имею в виду)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Я бы просто сделал это вручную с помощью класса File, что-то вроде:

    java.util.List<File> result = new ArrayList<File>();
    final String searchFor = "fixedName";

    for (File child : f.listFiles()) {
        result.addAll(Arrays.asList(
            child.listFiles(new FilenameFilter() {
                public boolean accept(File parent, String childName) {
                    return childName.equals(searchFor);
                }
            }
        )));
    }
0 голосов
/ 28 февраля 2011

Я лично не использовал эту функцию, но, глядя на API , я думаю, что вы неправильно интерпретируете аргументы метода.

listfiles принимает корневой каталог, фильтр файлов и фильтр каталогов.Фильтр каталогов предназначен для определения того, какие подкаталоги искать, а не для поиска каталогов.Вы хотите искать «fixedName» во всех подкаталогах.Я думаю, что вы действительно хотите вызвать метод следующим образом:

final File ROOTDIR = new File("/rootdir");
IOFileFilter nameFilter = new NameFileFilter("fixedName");
Collection<File> files = 
      FileUtils.listFiles(ROOTDIR, nameFilter, TrueFileFilter.INSTANCE);
...