繁体   English   中英

Java详尽的嵌套目录搜索

[英]Exhaustive Nested Directory Search in 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);

但是问题在于,仅搜索源目录下的文件和文件夹。 它没有深入。

我想念什么吗?

您为什么不只使用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));
}

问题在于,每次对方法进行递归调用时,都会将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]);
        }

    }
}

我不知道为什么你要用Strings来解决问题。 使用“ getAbsoluteFile”将路径作为字符串排列,因为将其打印到控制台并且仅在编程逻辑中对文件对象起作用。 这将使您的代码更加干净。

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

        }
}

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

这应该工作:

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

        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM