How to tell why a file deletion fails in Java?

让人想犯罪 __ 提交于 2019-12-17 05:07:57

问题


File file = new File(path);
if (!file.delete())
{
    throw new IOException(
        "Failed to delete the file because: " +
        getReasonForFileDeletionFailureInPlainEnglish(file));
}

Is there a good implementation of getReasonForFileDeletionFailureInPlainEnglish(file) already out there? Or else I'll just have to write it myself.


回答1:


In Java 6, there is unfortunately no way to determine why a file cannot be deleted. With Java 7, you can use java.nio.file.Path#delete() instead, which will give you a detailed cause of the failure, if the file or directory cannot be deleted.

Note that file.list() may return entries for directories, which can be deleted. The API documentation for delete says that only empty directories can be deleted, but a directory is considered empty, if the contained files are e.g. OS specific metadata files.




回答2:


Hmm, best I could do:

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



回答3:


Be aware that it can be your own application that prevents a file from being deleted!

If you wrote to the file previously and didn't close the writer, you are locking the file yourself.




回答4:


Java 7 java.nio.file.Files class can be also used:

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:


A deletion may fail due to one or more reasons:

  1. File does not exist (use File#exists() to test).
  2. File is locked (because it is opened by another app (or your own code!).
  3. You are not authorized (but that would have thrown a SecurityException, not returned false!).

So whenever deletion fails, do a File#exists() to check if it is caused by 1) or 2).

Summarized:

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:


As pointed out in File.delete()

you may use a SecurityManager that throws the exeception for you.



来源:https://stackoverflow.com/questions/1729049/how-to-tell-why-a-file-deletion-fails-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!