Java中的穷举嵌套目录搜索

时间:2015-03-06 12:05:35

标签: java

我正在编写一个递归程序,它将路径作为输入。然后,无论文件和文件夹在哪个深度,它都会详尽地搜索其下的所有文件和文件夹。

我已经编写了一个java程序,如下所示:

void RecursiveFileSearch(File f, String d) {
        int i;
        String s[] = f.list();
        for (i = 0; i < s.length; i++) {
            File fs = new File(d + "/" + s[i]);
            if (fs.isDirectory()) {
                System.out.println("#DIRECTORY :"+s[i]);
                d += "/" + s[i];
                RecursiveFileSearch(fs, d);
            } else {

                System.out.println("@FILE : "+s[i]);
            }

        }
}

此功能从外部调用,如:

String sourceDirectoryPath = "D:";
File sourceFile = new File(sourceDirectoryPath);
RecursiveFileSearch(sourceFile,sourceDirectoryPath);

但问题是只搜索源目录下的文件和文件夹。它没有进一步深入。

我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

为什么不使用JDK为您提供的API?

使用Java 8,它很简单:

try (
    final Stream<Path> stream = Files.walk(baseDir);
) {
    stream.forEach(path -> System.out.printf("%s: %s\n",
        (Files.isDirectory(path) ? "DIRECTORY": "FILE"), path));
}

答案 1 :(得分:1)

问题是String变量d在每次递归调用方法时都会发生变化,每次都会将目录名附加到上一个目录。您可以通过定义新的String变量来解决此问题,而不是重复使用相同的变量:

void RecursiveFileSearch(File f, String d) {
    int i;
    String s[] = f.list();
    for (i = 0; i < s.length; i++) {
        File fs = new File(d + "/" + s[i]);
        if (fs.isDirectory()) {
            System.out.println("#DIRECTORY :"+s[i]);
            String d2 = d + "/" + s[i];
            RecursiveFileSearch(fs, d2);
        } else {

            System.out.println("@FILE : "+s[i]);
        }

    }
}

答案 2 :(得分:1)

我不知道你为什么要使用Strings来解决这个问题。使用“getAbsoluteFile”将Path作为字符串格式化,然后将其打印到控制台,并仅在编程逻辑中的文件对象上工作。这将使您的代码更加清晰。

void RecursiveFileSearch(File f) {            
        File[] list = f.listFiles();
        for (File elem : list) {

            if (elem.isDirectory()) {
                System.out.println("#DIRECTORY:"+elem.getAbsoluteFile());

                RecursiveFileSearch(x);
            } else {

                System.out.println("@FILE : "+elem.getAbsoluteFile());
            }

        }
}

编辑:删除现在无用的声明,如果我。

答案 3 :(得分:0)

这应该有效:

void RecursiveFileSearch(File f, String d) {
        int i;
        String s[] = f.list();
        for (i = 0; i < s.length; i++) {
            File fs = new File(d + "/" + s[i]);
            if (fs.isDirectory()) {
                System.out.println("#DIRECTORY :"+s[i]);

                RecursiveFileSearch(fs, d + "/" + s[i]);
            } else {

                System.out.println("@FILE : "+s[i]);
            }

        }
}