0

次の標準的なディレクトリ トラバーサル コードを検討してください。

static void walk(File f) throws IOException{
    System.out.println(f.getPath());

    if(f.isFile()) return;  // leaf

    File[] subs = f.listFiles(); // If it aint a file, it's a directory. Right? 

    if(subs == null) return; // returns null at some point

    for(File subDir : subs){
        walk(subDir.getAbsoluteFile()); 
    }
}

次のディレクトリ構造で実行すると、c:\ -> Folder1 -> Folder2 (=a symbolic link to c:\Folder1)ある時点でf.listFiles()が返されますnull。ドキュメントから、listFiles

この抽象パス名がディレクトリを示さない場合、または I/O エラーが発生した場合は null を返します。

明らかに、パスはディレクトリを示しています。これはおそらく、I/O エラーが発生したことを意味します。しかし、エラー自体は何ですか?

4

1 に答える 1

1

興味深いことに、この変更を行うと

if(subs == null) 
{
    System.out.println("is now null");
    File h = new File(f,"t");
    h.createNewFile();
    return; // returns null at some point
}

スタックの一番上にファイルを作成しようとすると、次の例外が発生します。

java.io.IOException: The name of the file cannot be resolved by the system
       at java.io.WinNTFileSystem.createFileExclusively(Native Method)
       .....

また、ディレクトリであるかどうかのチェックを追加するだけの場合

if(!f.isDirectory())
    System.out.println("######## Not a Directory  #####");

スタックの一番上の時点でこれが出力されるlistFiles()ため、ディレクトリではないためnullが返され、OSとパスが長すぎるために例外がスローされません。

于 2013-08-26T22:25:23.620 に答える