2

最初に状況を説明したほうがいいと思います。

状況

私は s をフィルタリングするソフトウェアを少し書いていSetますFile

フィルターは次のとおりです。ファイルが非表示でない場合は、それを新しい に追加しSetます。

問題は、 の現在の動作がFile.isHidden()次のようになっていることです。

File f = new File("C:\Documents and Settings\Administrator\Local Settings\Temp\REG28E.tmp");
System.out.println(f.isHidden());

プログラムは を出力しますfalse

ファイル自体 ( REG28E.tmp) は実際には隠されていません。むしろ、それへのパスにある特定のフォルダーが非表示になっています ( Local Settings)。

チェックするコードを少し作成したいと思います。

ファイルへのパスのどこかが非表示になっている場合、そのファイルは非表示としてマークされます。

ファイルのパスを再帰的にチェックするために、次の解決策を思い付きました。

boolean hidden = file.isHidden();
File parentFile = file.getParentFile();
while ((hidden == false) || (parentFile != null)) {
    hidden = parentFile.isHidden();
    parentFile = parentFile.getParentFile();
}

if (!hidden) {
    acceptedFileList.add(file);
}

問題

そして最後に、問題に行き着きます。実際にファイルを追加する段階に到達することはできません。問題は、Java が C:\ ドライブ自体が隠されていると判断することです!

代わりに何ができますか?

4

2 に答える 2

1

私の推測では、while条件には&&代わりに演算子が必要です||(おそらくいくつかのNPEが発生しました)。
試す:

while (!hidden && (parentFile != null)) {...
于 2012-08-08T10:26:45.323 に答える
1

parentFileこの解決策には、オブジェクトがルート ディレクトリであるかどうかを確認するための手動チェックを追加することが含まれていました。

while ((hidden == false) && (parentFile != null)) {
    // added the IF statement below:
    if (FileSystemUtils.isRoot(parentFile)) {
        hidden = false;
        break;
    }

    hidden = parentFile.isHidden();
    parentFile = parentFile.getParentFile();
}


ルートディレクトリかどうかの確認

上記のコードは FileSystemUtils クラスを利用しています。次のメソッドが含まれています。

public static boolean isRoot(File file) {
    File[] roots = File.listRoots();

    for (File root : roots) {
        if (file.equals(root)) {
        return true;
        }
    }

    return false;
}

声をかけてくれた皆さん、ありがとう...

于 2012-08-08T11:49:20.317 に答える