Как узнать, почему сбой на удалении файлов на Java?
File file = new File(path);
if (!file.delete())
{
throw new IOException(
"Failed to delete the file because: " +
getReasonForFileDeletionFailureInPlainEnglish(file));
}
Есть ли хорошая реализация getReasonForFileDeletionFailureInPlainEnglish(file)
уже там? Или мне просто нужно написать это самостоятельно.
Ответы
Ответ 1
В Java 6, к сожалению, нет способа определить, почему файл не может быть удален. С помощью Java 7 вы можете использовать java.nio.file.Path#delete()
вместо этого, что даст вам подробную причину сбоя, если файл или каталог не могут быть удалены.
Обратите внимание, что file.list() может возвращать записи для каталогов, которые можно удалить. В документации по API для удаления говорится, что можно удалить только пустые каталоги, но каталог считается пустым, если содержащиеся в нем файлы являются, например, Отдельные файлы метаданных ОС.
Ответ 2
Хм, лучше всего я мог бы сделать:
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 a directory and it 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.";
}
}
Ответ 3
Помните, что это может быть ваше собственное приложение, которое предотвращает удаление файла!
Если вы ранее писали файл и не закрывали запись, вы сами запираете файл.
Ответ 4
Можно использовать Java 7 java.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);
}
Ответ 5
Удаление может завершиться ошибкой по одной или нескольким причинам:
- Файл не существует (используйте
File#exists()
для проверки).
- Файл заблокирован (потому что он открывается другим приложением (или вашим собственным кодом!).
- Вы не авторизованы (но это привело бы к исключению 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 + ".");
}
Ответ 6
Как указано в File.delete()
вы можете использовать SecurityManager, который бросает вам выкидыш.