0

我正在尝试使用该程序来计算 D:\ 驱动器中的所有文件,但是当我运行它时它会引发异常。

package lmh;

import java.io.File;

public class FileList {

    static int fileNum = 0;
    static int directoryNum = 0;
    static int cannotRead = 0;

    public static void main(String[] args) {
        File f = new File("e:/");
        printFileStructure(f);
        System.out.println("result:");
        System.out.println("file number:" + fileNum);
        System.out.println("directory number:" + directoryNum);
        System.out.println("cannot rend:" + cannotRead);
    }

    public static void printFileStructure(File f) {
        File[] files = f.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()) {
                if (files[i].canRead()) {
                    fileNum++;
                    System.out.println(files[i].getName());
                } else {
                    cannotRead ++;
                } 
            }
            else if (files[i].isDirectory()) {
                if (files[i].canRead()) {
                    directoryNum++;
                    printFileStructure(files[i]);
                } else {
                    cannotRead ++;
                }
            }
        }
    }
}
4

4 回答 4

5

File.listFiles()不保证返回非空值。这往往会发生(根据我的经验),因为 Java 可以看到看起来像目录的内容,但无法列出它(想到联结)

于 2012-07-25T05:04:28.960 回答
3

甚至是javadoc

f.listFiles()

说... 如果此抽象路径名不表示目录,则此方法返回 null。否则返回一个 File 对象数组,一个对应于目录中的每个文件或目录。结果中不包括表示目录本身和目录父目录的路径名。每个生成的抽象路径名都是使用 File(File, String) 构造函数从这个抽象路径名构造的。因此,如果这个路径名是绝对的,那么每个生成的路径名都是绝对的;如果此路径名是相对的,则每个生成的路径名都将相对于同一目录。

所以我相信这是罪魁祸首。

于 2012-07-25T05:09:57.947 回答
2

由于 MadProgrammer 指出的原因,添加一个空检查。

代替:

for (int i = 0; i < files.length; i++) {

if(files != null)
    for (int i = 0; i < files.length; i++) {

我将驱动器更改为 D (因为我没有 E 驱动器)并且程序在我的机器上成功完成了这个修复。

于 2012-07-25T05:08:58.947 回答
0

尝试“E:\\”进入目录。我认为它应该工作。

于 2012-07-25T05:17:55.863 回答