递归搜索Java中的目录

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

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

java.io.File API参考

在Java 8中通过流API :

 Optional 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 directories = new ArrayList(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; } }