39
File file = new File(path);
if (!file.delete())
{
    throw new IOException(
        "Failed to delete the file because: " +
        getReasonForFileDeletionFailureInPlainEnglish(file));
}

getReasonForFileDeletionFailureInPlainEnglish(file)すでにそこにある良い実装はありますか? さもなければ、自分で書くしかありません。

4

6 に答える 6

24

残念ながら、Java 6 では、ファイルを削除できない理由を特定する方法はありません。Java 7 ではjava.nio.file.Files#delete()代わりに を使用できます。これにより、ファイルまたはディレクトリを削除できない場合に、失敗の詳細な原​​因が示されます。

file.list() は削除可能なディレクトリのエントリを返す場合があることに注意してください。削除の API ドキュメントには、空のディレクトリのみを削除できると記載されていますが、含まれているファイルが OS 固有のメタデータ ファイルなどである場合、ディレクトリは空と見なされます。

于 2009-11-13T13:09:26.453 に答える
22

うーん、私ができる最善のこと:

public String getReasonForFileDeletionFailureInPlainEnglish(File file) {
    try {
        if (!file.exists())
            return "It doesn't exist in the first place.";
        else if (file.isDirectory() && file.list().length > 0)
            return "It's a directory and it's not empty.";
        else
            return "Somebody else has it open, we don't have write permissions, or somebody stole my disk.";
    } catch (SecurityException e) {
        return "We're sandboxed and don't have filesystem access.";
    }
}
于 2009-11-13T13:02:17.233 に答える
10

ファイルの削除を妨げているのは、独自のアプリケーションである可能性があることに注意してください。

以前にファイルに書き込みを行い、ライターを閉じていない場合は、ファイルを自分でロックしています。

于 2012-07-05T08:53:41.240 に答える
5

次の 1 つ以上の理由により、削除が失敗する場合があります。

  1. ファイルが存在しません (File#exists()テストに使用)。
  2. ファイルがロックされています (別のアプリ (または独自のコード!) によって開かれているため)。
  3. あなたは許可されていません (ただし、それは SecurityException をスローし、false を返しません!)。

そのため、削除に失敗するたびにFile#exists()、1) または 2) が原因であるかどうかを確認するために a を実行します。

要約:

if (!file.delete()) {
    String message = file.exists() ? "is in use by another app" : "does not exist";
    throw new IOException("Cannot delete file, because file " + message + ".");
}
于 2009-11-13T12:59:45.110 に答える
-1

File.delete()で指摘されているように

例外をスローする SecurityManager を使用できます。

于 2009-11-13T12:56:04.810 に答える