Рекурсивный поиск каталога в Java

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

7 ответов


ваше решение будет включать использование File.listFiles(String)

java.io.File ссылка на API


в Java 8 через API потоков:

Optional<Path> hit = Files.walk(myPath)
   .filter(file -> file.getFileName().equals(myName))
   .findAny();

#walk ленивый, поэтому любой короткое замыкание терминала оптимизирует требуемый IO.


ходить по дереву файлов, FileVisitor интерфейс можно использовать. См.учебник. Пожалуйста, смотрите найти примеры кодов также.


Как вы упомянули, рекурсия должна удовлетворять этому требованию

import java.io.File;

public class CheckFile {

    private static boolean foundFolder = false;

    public static void main(String[] args) {
        File dir = new File("currentdirectory");
        findDirectory(dir);
    }

    private static void findDirectory(File parentDirectory) {
        if(foundFolder) {
            return;
        }
        File[] files = parentDirectory.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                continue;
            }
            if (file.getName().equals("folderNameToFind")) {
                foundFolder = true;
                break;
            }
            if(file.isDirectory()) {
               findDirectory(file);
            }
        }
    }

}

что-то типа:

public static final File findIt(File rootDir, String fileName) {
    File[] files = rootDir.listFiles();
    List<File> directories = new ArrayList<File>(files.length);
    for (File file : files) {
        if (file.getName().equals(fileName)) {
            return file;
        } else if (file.isDirectory()) {
            directories.add(file);
        }
    }

    for (File directory : directories) {
        File file = findIt(directory);
        if (file != null) {
            return file;
        }
    }

    return null;
}

Разделяй и властвуй? Наивный подход: для каждого каталога вы можете запустить задачу, она делает следующее:

  1. список всех каталогов
  2. Если список содержит соответствующий каталог, печатает и выходит из приложения
  3. запустить задачу для каждого каталога.

или вы должны использовать концепцию рекурсивного поиска файла, пока он не будет найден: вот код:

String name; //to hold the search file name

public String listFolder(File dir) {
    int flag;
    File[] subDirs = dir.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory();
        }
    });
    System.out.println("File of Directory: " + dir.getAbsolutePath());
    flag = Listfile(dir);
    if (flag == 0) {
        System.out.println("File Found in THe Directory: " + dir.getAbsolutePath());
        Speak("File Found in THe Directory: !!" + dir.getAbsolutePath());
        return dir.getAbsolutePath();
    }
    for (File folder : subDirs) {
        listFolder(folder);
    }
    return null;
}

private int Listfile(File dir) {
    boolean ch = false;
    File[] files = dir.listFiles();
    for (File file : files) {
        Listfile(file);
        if (file.getName().indexOf(name.toLowerCase()) != -1) {//check all in lower case
            System.out.println(name + "Found Sucessfully!!");
            ch = true;

        }
    }
    if (ch) {
        return 1;
    } else {
        return 0;
    }
}