_File file = new File(path);
if (!file.delete())
{
throw new IOException(
"Failed to delete the file because: " +
getReasonForFileDeletionFailureInPlainEnglish(file));
}
_
getReasonForFileDeletionFailureInPlainEnglish(file)
の適切な実装はすでにありますか?それ以外の場合は、自分で書く必要があります。
Java 6では、ファイルを削除できない理由を判別する方法はありません。Java 7の場合、Java.nio.file.Path#delete()
を使用できます代わりに、ファイルまたはディレクトリを削除できない場合の失敗の詳細な原因が表示されます。
File.list()はディレクトリのエントリを返す可能性があることに注意してください。これは削除できます。削除のAPIドキュメントには、空のディレクトリしか削除できないと記載されていますが、含まれているファイルがOS固有のメタデータファイル。
うーん、私ができる最善のこと:
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.";
}
}
ファイルが削除されないようにする独自のアプリケーションである可能性があることに注意してください!
以前にファイルに書き込み、ライターを閉じなかった場合は、ファイルを自分でロックしています。
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);
}
次の1つまたは複数の理由により、削除が失敗する場合があります。
File#exists()
を使用してください)。したがって、削除が失敗した場合は必ず、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 + ".");
}