以Java的形式递归搜索目录

时间:2012-05-28 07:14:52

标签: java search directory find

在Java中查找具有特定名称的目录的最佳方法是什么?我正在寻找的目录可以位于当前目录或其子目录之一。

7 个答案:

答案 0 :(得分:7)

在Java 8中通过streams API

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

#walk是懒惰的,所以任何short-circuiting terminal operation都会优化所需的IO。

答案 1 :(得分:4)

要遍历文件树,可以使用FileVisitor界面。 请参阅tutorial。另请参阅Find sample codes

答案 2 :(得分:3)

如你所说,递归应该满足这个要求

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);
            }
        }
    }

}

答案 3 :(得分:2)

您的解决方案将包括使用File.listFiles(String)

java.io.File API reference

答案 4 :(得分:0)

分而治之?一种天真的方法:对于每个目录,您可以启动任务,它执行以下操作:

  1. 列出每个目录
  2. 如果列表包含匹配的目录,则打印并退出应用程序
  3. 为每个目录启动任务。

答案 5 :(得分:0)

类似的东西:

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;
}

答案 6 :(得分:0)

或者,你应该使用递归搜索文件的概念,直到它找到:这是代码:

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;
    }
}