0

我必须搜索可以在任何目录或驱动器中的文件。它应该与任何操作系统兼容。当我用谷歌搜索时,大多数代码都会遍历特定目录而不是完整的文件系统。有没有办法有效地做到这一点?任何帮助或建议将不胜感激。

下面是我从http://www.mkyong.com/java/how-to-traverse-a-directory-structure-in-java/获得的代码,但我们必须传递一些目录作为参数。有没有办法概括得到所有的位置?

public static void main (String args[]) {

    displayIt(new File("C:\\"));
}

public static void displayIt(File node){

    System.out.println(node.getAbsoluteFile());

    if(node.isDirectory()){
        String[] subNote = node.list();
        for(String filename : subNote){
            displayIt(new File(node, filename));
        }
}
4

3 回答 3

3

Apache Commons-IO 是这种操作的一个很好的 API。对于 Unix 系统,您可以只使用 root "/",但这不适用于 windows,因此您必须询问所有 root 并遍历它们:

File[] roots = File.listRoots();

Collection<File> files = new ArrayList<File>();    

for(File root : roots) {
    files.addAll(FileUtils.listFiles(
      root, 
      new RegexFileFilter(<your regex filter>), 
      DirectoryFileFilter.DIRECTORY
    ));
} 
于 2012-10-16T08:30:30.043 回答
1

这种代码片段将列出目录和子目录中的所有文件。您不必将任何文件添加到 allFiles 中,您可以在那里进行检查。由于您还没有提供任何代码(所以我假设您还没有尝试过任何东西)我会让您更新它;)

private void addFiles(File file, Collection<File> allFiles) {
    File[] files = file.listFiles();
    if (files != null) {
       for (File f : files) {
           allFiles.add(f);
           addFiles(f, allFiles);
       }
    }
}
于 2012-10-16T08:30:38.060 回答
0

如果你想通过递归来做到这一点,这里是 DFS 的代码,代码可能不起作用(我从不测试它),并且它没有优化,但它可能会给你一些想法如何解决你的问题

File find(String directoryName, String pattern)
{
 File currentDirectory = loadFile(directoryName);

for (String name: currentDirectory .list())
{
File children = loadFile(name)

if (children.isDirectory())
{
 File file = find(name, pattern)
 if (file !=null)
 {
  return file;
 }
}
else
{
 if (match(name,pattern)
  {
   return children;
  }
}
}
return null;

}
于 2012-10-16T08:51:47.883 回答