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()null 以外の値を返すことは保証されていません。これは、(私の経験から) Java がディレクトリのように見えるものを認識できたが、それをリストできなかったために発生する傾向があります (ジャンクションが思い浮かびます)。

于 2012-07-25T05:04:28.960 に答える
3

のjavadocでさえ

f.listFiles()

言う... この抽象パス名がディレクトリを示さない場合、このメソッドは null を返します。それ以外の場合は、ディレクトリ内のファイルまたはディレクトリごとに 1 つの File オブジェクトの配列が返されます。ディレクトリ自体とディレクトリの親ディレクトリを示すパス名は結果に含まれません。結果の各抽象パス名は、File(File, String) コンストラクターを使用して、この抽象パス名から構築されます。したがって、このパス名が絶対パスである場合、結果の各パス名は絶対パスになります。このパス名が相対パスの場合、結果として得られる各パス名は同じディレクトリに対して相対パスになります。

だから私はこれが犯人だと信じています。

于 2012-07-25T05:09:57.947 に答える
2

MadProgrammer が指摘した理由により、null チェックを追加します。

交換:

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 に答える