File file = new File(path);
if (!file.delete())
{
throw new IOException(
"Failed to delete the file because: " +
getReasonForFileDeletionFailureInPlainEnglish(file));
}
那里有getReasonForFileDeletionFailureInPlainEnglish(file)
的良好实施吗?或者我只需要自己写。
答案 0 :(得分:23)
在Java 6中,遗憾的是无法确定无法删除文件的原因。使用Java 7,您可以使用java.nio.file.Path#delete()
代替,如果无法删除文件或目录,这将为您提供失败的详细原因。
请注意,file.list()可能会返回目录的条目,这些条目可以删除。用于删除的API文档表示只能删除空目录,但如果包含的文件是例如,则目录被认为是空的。 OS特定的元数据文件。
答案 1 :(得分:21)
嗯,我能做的最好:
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.";
}
}
答案 2 :(得分:10)
请注意,可能是您自己的应用程序阻止文件被删除!
如果您之前写过该文件并且没有关闭该编写器,则您自己锁定该文件。
答案 3 :(得分:7)
也可以使用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 :(得分:4)
由于一个或多个原因,删除可能会失败:
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 + ".");
}
答案 5 :(得分:-1)
您可以使用为您抛出异常的SecurityManager。