web-dev-qa-db-ja.com

Javaでファイルの削除が失敗する理由を知る方法は?

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

getReasonForFileDeletionFailureInPlainEnglish(file)の適切な実装はすでにありますか?それ以外の場合は、自分で書く必要があります。

39
Arne Evertsson

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

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

24
jarnbjo

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

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.";
    }
}
21
Cory Petosky

ファイルが削除されないようにする独自のアプリケーションである可能性があることに注意してください!

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

10
xastor

Java 7Java.nio.file.Filesクラスも使用できます。

http://docs.Oracle.com/javase/tutorial/essential/io/delete.html

try {
    Files.delete(path);
} catch (NoSuchFileException x) {
    System.err.format("%s: no such" + " file or directory%n", path);
} catch (DirectoryNotEmptyException x) {
    System.err.format("%s not empty%n", path);
} catch (IOException x) {
    // File permission problems are caught here.
    System.err.println(x);
}
9
Quark

次の1つまたは複数の理由により、削除が失敗する場合があります。

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

したがって、削除が失敗した場合は必ず、File#exists()を実行して、1)または2)が原因であるかどうかを確認してください。

要約:

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 + ".");
}
4
BalusC