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 文档说只能删除空目录,但如果包含的文件是例如操作系统特定的元数据文件,则目录被认为是空的。

于 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 回答
9

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);
}
于 2015-02-19T10:11:23.403 回答
5

删除可能由于一个或多个原因而失败:

  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 + ".");
}
于 2009-11-13T12:59:45.110 回答
-1

正如File.delete()中指出的那样

您可以使用为您抛出异常的 SecurityManager。

于 2009-11-13T12:56:04.810 回答