使用java递归深度优先遍历文件系统

时间:2014-03-20 15:47:55

标签: java recursion filesystems

我需要使用java浏览随机文件系统(windows)。

问题:它需要自下而上,因为我将数据合并在一起,根应该包含我的所有数据集。

到目前为止我所拥有的:

private void listDir(File dir) {
    File[] files = dir.listFiles();
    if (files != null) {
        for (int i = 0; i < files.length; i++) {
            System.out.print(files[i].getAbsolutePath());
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                listDir(files[i]);  //Recursion
            }
            else {
                System.out.print(" (File)\n");
            }
        }
    }
}

那么任何想法如何实现呢?

我感谢任何帮助,希望我不会因为我的问题而烦恼你^^

3 个答案:

答案 0 :(得分:1)

通常,使用深度优先树递归,您可以通过更改输出语句和递归调用的顺序来影响输出的顺序。

拿这棵树:

        1
       / \
      2   3
     / \   \
    4   5   6

如果我的代码说(此答案中的所有代码都是伪代码):

 void f(Node node) {
      if(node == null) return;
      print node.value;
      f(node.left);
      f(node.right);
 }

...然后输出1 2 4 5 3 6 - 按照你头脑中的逻辑验证这是真的。

如果我只改变陈述的顺序:

 void f(Node node) {
      if(node == null) return;
      f(node.left);
      print node.value;
      f(node.right);
 }

现在它打印4 2 5 1 3 6 - 再次按照逻辑并验证它是对的。

 void f(Node node) {
      if(node == null) return;
      f(node.left);
      f(node.right);
      print node.value;
 }

...打印4 5 2 6 3 1 - 可能是你想要的。

您可能需要广泛的首次遍历,并且您可能希望颠倒输出的顺序 - Google中有一些示例。

在文件系统中,有更多的孩子而不是左右,所以更像是:

 void recursiveList(File f) { // f could be a file or a directory
      if(f is a file) {
           output file info about f
           return
      }
      // else it's a directory
      for(File entry : f.getChildren()) {
          recursiveList(entry);
      }
      output directory info about f
  }

答案 1 :(得分:0)

您可以为每个目录首先处理子目录,然后处理目录中的文件。

private void listDir(File dir) {
    File[] files = dir.listFiles();
    if (files != null) {
        for (int i = 0; i < files.length; i++) { // Directories
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                listDir(files[i]); //Recursion
            }
        }
        for (int i = 0; i < files.length; i++) { // Files
            if (!files[i].isDirectory()) {
                System.out.print(" (File)\n");
            }
        }
    }
}

也许你想要这样的东西:

private int countFiles(File dir) {
    int res = 0;
    if (files != null) {
        for (int i = 0; i < files.length; i++) { // Files
            if (!files[i].isDirectory()) {
                System.out.print(" (File)\n");
                res++;
            }
        }
    }
    return res;
}
private int countFilesDeep(File dir) {
    File[] files = dir.listFiles();
    int res = 0;
    if (files != null) {
        for (int i = 0; i < files.length; i++) { // Directories
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                res += countFilesDeep(files[i]); //Recursion
            }
        }
    }
    res += countFiles(dir);
    return res;
}

答案 2 :(得分:0)

所以我写了这个:

 public void walkFilesystem(File f)
{

    File[] arr= f.listFiles();
    if(arr.length>0) //-> against nullPointer
    {
        for(File file : arr)
        {
            if(file.isDirectory())
            {
                System.out.println(file.getAbsolutePath()+" (Directory)");
                walkFilesystem(file);
            }
            else if(file.isFile()&&file.getPath().contains("txt"))
            {
                System.out.println(file.getAbsolutePath()+" (node)");
            }
        }
    }

}

应该不应该工作吗?