首页 文章

Java - 递归只是停止,我不明白为什么

提问于
浏览
0

因此,正如 Headers 中所述,我面临的问题是我的程序不会遍历我计算机的所有可能目录 .

使用此代码,我试图找到没有父项的根文件夹,然后从那里查看所有文件夹及其子文件夹等等 .

运行后,它通过第一个目录(对我来说是C :)并找到所有可见的子文件夹 . 然后它进入第一个文件夹并再次退出,因为它不包含任何其他目录 . 它接近编辑器的第二个目录,并且不会出现在我的资源管理器中,即使它不应该被隐藏 .

我的编译器在此停止,不会抛出错误消息 .

Code:

public class Main {

public static File getRootFile(File file){
        boolean hasParent = true;
        while (hasParent){
            File parentFile = file.getParentFile();
            file = parentFile;
            hasParent = file.getParentFile() != null;
        }
        return file;
}
//Recursion with starting file parameter
public static void rekursion(File pathFile) {
    String path = pathFile.toString();
    File[] directories_with_hiddenFiles = new File(path).listFiles(File::isDirectory);
    int notNull = 0;
    for (int i = 0;i< directories_with_hiddenFiles.length;i++){
        if (!directories_with_hiddenFiles[i].isHidden()){
            notNull++;
        }
    }
    File[] directories = new File[notNull];
    for (int i=0, j=0;i<directories_with_hiddenFiles.length;i++){
        if(!directories_with_hiddenFiles[i].isHidden()){
            directories[j]=directories_with_hiddenFiles[i];
            j++;

        }
    }

    //Calls up recursion for each file
    try {
        for (File a : directories) {
            rekursion(a);
        }
    } catch (NullPointerException e) {
    }
}

public static void main(String[] args) {
    //Starting Point (Root)
    File pathOfThisFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    File rootFile = getRootFile(pathOfThisFile);
    rekursion(rootFile);
}
}

2 回答

  • 0

    您可以通过将要检查的条件传递到初始查询来避免复杂的代码:

    File[] directories = new File(path).listFiles(f -> f.isDirectory() && !f.isHidden()); // loads all not hidden subdirectories, which is what you are trying to do
    if (directories != null) { // listFiles can return null, so check it before iterating
        for (File a : directories) {
                  rekursion(a);
        }
    }
    
  • 1

    当你的递归函数获得一个你正在运行的用户没有读取权限的目录时,你会得到一个空指针异常,

    File[] directories_with_hiddenFiles = new File(path).listFiles(File::isDirectory);
    

    将返回null .

    您可以使用File.canRead()来检查,老实说,您的代码有多个问题 .

相关问题