如何判断文件删除在Java中失败的原因?

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文档指出,只有空目录可以被删除,但如果包含的文件是特定于操作系统的元数据文件,则该目录被认为是空的。

嗯,我可以做的最好的:

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

请注意,它可以是您自己的应用程序,防止文件被删除!

如果您以前写入文件并且没有closures写入器,则您正在locking文件。

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); } 

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

  1. 文件不存在(使用File#exists()来testing)。
  2. 文件被locking(因为它被另一个应用程序(或您自己的代码!)打开)。
  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 + "."); } 

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

你可以使用一个SecurityManager来为你引发怀疑。