2012-05-28 87 views
6

在Java中查找具有特定名称的目录的最佳方式是什么?我正在查找的目录可以位于当前目录或其某个子目录中。在Java中递归搜索目录

+3

[?你尝试过什么(http://www.whathaveyoutried.com/)或者说,你的理论基于测试你能想到的最好的2种耸肩方法?或者这个问题实际上是否意味着“你能给我编码吗?”? –

回答

2

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

java.io.File API reference

+0

谢谢安德鲁。我受限于1.6,但我忘记了其他人不是。 – MadcoreTom

+0

*“我被约束了1.6”*和我一样(除了当我回到1.5 dev或更高版本时)。幸运的那些文档。有'@ since'标签和编译器具有交叉编译选项作为版本兼容性的'酸性测试'。即使人们提到他们正在为Java 1.3开发,我也会链接到最新的Java Docs。 ;) –

0

分而治之?天真的方法:对于每一个目录,你可以开始一个任务,它具有以下功能:

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

要走文件树,可以使用FileVisitor接口。 请参阅tutorial。另请参阅Find sample codes

+0

这是比@ MadcoreTom的#listFiles更好的解决方案,因为它可以让您在找到文件后终止漫游。 – Kong

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

至于你提到的递归应该通过streams API迎合这种需求

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

} 
+0

我是否正确,这种方法是不可重复使用的(将其移动到某个实用程序类将不起作用),即它只能检测一次文件夹,一旦检测到“foundFolder”将保持为真? –

5

在Java 8:

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

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

+0

将'Path.getFileName'中的'java.nio.Path'与'String'进行比较。我建议'file.getFileName()。toFile.getName()'知道这看起来很复杂,也许很昂贵。 –

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