繁体   English   中英

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

[英]Java - Recursion just stops and i don't understand why

因此,正如标题中所述,我遇到了程序无法遍历计算机所有可能目录的问题。

使用此代码,我试图找到没有父级的根文件夹,然后从那里遍历所有文件夹及其子文件夹,等等。

运行后,它将通过第一个目录(对我来说是C :),并找到所有可见的子文件夹。 之后,由于它不包含任何其他目录,因此它将进入第一个文件夹并再次退出。 它所接近的第二个目录仅存在于编译器中,即使不应该隐藏也不会显示在我的资源管理器中。

我的编译器到此为止,并且不会引发错误消息。

码:

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

通过将要检查的两个条件都传递到初始查询中,可以避免复杂的代码:

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

当您的递归函数获得一个目录,您正在运行的用户不具有读取权限,并且

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

将返回null。

您可以使用File.canRead()进行检查,说实话,您的代码有多个问题。

暂无
暂无

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

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