Как сказать, почему удаление файла не удается в Java? - PullRequest
37 голосов
/ 13 ноября 2009
File file = new File(path);
if (!file.delete())
{
    throw new IOException(
        "Failed to delete the file because: " +
        getReasonForFileDeletionFailureInPlainEnglish(file));
}

Есть ли хорошая реализация getReasonForFileDeletionFailureInPlainEnglish(file) уже там? Или же мне просто придется написать самому.

Ответы [ 6 ]

24 голосов
/ 13 ноября 2009

В Java 6, к сожалению, нет способа определить, почему файл не может быть удален. В Java 7 вместо этого вы можете использовать java.nio.file.Path#delete(), что даст вам подробную причину сбоя, если файл или каталог не может быть удален.

Обратите внимание, что file.list () может возвращать записи для каталогов, которые могут быть удалены. В документации API для удаления говорится, что могут быть удалены только пустые каталоги, но каталог считается пустым, если содержащиеся в нем файлы, например, Файлы метаданных для конкретной ОС.

21 голосов
/ 13 ноября 2009

Хм, лучшее, что я мог сделать:

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.";
    }
}
10 голосов
/ 05 июля 2012

Имейте в виду, что это может быть ваше собственное приложение, которое предотвращает удаление файла!

Если вы ранее писали в файл и не закрывали программу записи, вы сами блокируете файл.

8 голосов
/ 19 февраля 2015

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);
}
4 голосов
/ 13 ноября 2009

Удаление может завершиться неудачно по одной или нескольким причинам:

  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 + ".");
}
0 голосов
/ 13 ноября 2009

Как указано в File.delete ()

вы можете использовать SecurityManager, который создает исключение для вас.

...