首页 > 解决方案 > 尝试使用 java 8 从系统根目录递归列出所有文件时出现“Config.Msi”目录问题

问题描述

我试图递归地列出系统根目录、目录和单个文件中的所有文件,代码运行没有任何异常,但是当代码找到“Config.Msi”作为目录时,它在列出和查找子目录的函数上给了我一个错误。

//Root path scan
for (File file : FilesInDisk) {
    if (file.isFile()){
        System.out.println("---------------------------------------------------------------------------------------------------------");
        System.out.println("[File Detected] => [ " + file.getName()+" ]");
        fileCache.add(fileIndex,file);
        System.out.println("[ Absolute path added to files cache ] [Details] => "+file.getAbsolutePath());
        fileIndex=fileIndex+1;
        System.out.println("---------------------------------------------------------------------------------------------------------");
    }

    else 
        if (file.isDirectory()){
            System.out.println("---------------------------------------------------------------------------------------------------------");
            //Walk into directory and walk more while directories still exist then return and go on with next one
            System.out.println("[Folder Detected] => [ " + file.getName()+" ]");
            System.out.println("[ Absolute path added to files cache ] [Details] => "+file.getAbsolutePath());
            subDirs(file);
            folderIndex=folderIndex+1;
            System.out.println("---------------------------------------------------------------------------------------------------------");
        }
       System.out.println("=> Files Scanned: " + fileIndex);
       System.out.println("Scanning on progress...");
    } 
}

而这个是 subDirs 函数

//Look inside directories.
public void subDirs(File ifile){
    File arrayDir[]=ifile.listFiles();
    for (File arr :arrayDir){
        System.out.println("===> " + arr);
    }  
}
[Folder Detected] => [ Config.Msi ]
[ Absolute path added to files cache ] [Details] => C:\Config.Msi
Exception in thread "main" java.lang.NullPointerException
    at malwaredestroyer.MalwareDestroyer.subDirs(MalwareDestroyer.java:58)
    at malwaredestroyer.MalwareDestroyer.walk(MalwareDestroyer.java:89)
    at malwaredestroyer.MalwareDestroyer.main(MalwareDestroyer.java:100)

这是我从输出控制台收到的错误消息,

标签: javaarraysfiledirectoryio

解决方案


的文档File.listFiles()说:

返回: 抽象路径名数组,表示此抽象路径名所表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。

所以可能发生了 I/O 错误null并被返回。但是,很难判断这是否是实际问题。

一般来说,建议尽可能使用java.nio.file包的类,因为它们在失败的情况下会抛出异常,并且它们的行为得到了更好的定义。

对于您的用例Files.walkFileTree似乎非常适合。


推荐阅读