Java File.delete()不会删除所有文件

时间:2013-11-02 17:20:16

标签: java delete-file

我有以下Java代码,它遍历目录中的所有文件并删除它们。

for(File file : tmpDir.listFiles())
{
    file.delete();
}

但它不会删除所有文件。当我这样做时,一些,通常是20到30,中有几千。是否有可能解决这个问题,或者我偶然发现了一些最好独自留下的Java伏都教?

3 个答案:

答案 0 :(得分:10)

它返回boolean值,你应该检查一下。来自JavaDoc

  

返回:       当且仅当文件或目录被成功删除时才返回true;否则是假的

您应该检查退货的价值并采取行动。

如果它返回false,则可能是您无权删除该文件。

在这种情况下,您可以检查文件是否可由应用程序写入,如果没有尝试使其可写 - 再次返回boolean。如果成功,您可以尝试再次删除。

您可以使用实用程序方法:

private void deleteFile(final File f) throws IOException {
    if (f.delete()) {
        return;
    }
    if (!f.canWrite() && !f.setWritable(true)) {
        throw new IOException("No write permissions on file '" + f + "' and cannot set writeable.");
    }
    if (!f.delete()) {
        throw new IOException("Failed to delete file '" + f + "' even after setting writeable; file may be locked.");
    }
}

我也会在JavaDoc中接受他们的建议:

  

请注意,Files类定义了要抛出的delete方法   IOException无法删除文件时。这对错误很有用   报告并诊断无法删除文件的原因。

前提是您使用的是Java 7。该方法抛出了许多可以处理的异常:

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

取自Oracle tutorial page

的示例

答案 1 :(得分:3)

强制垃圾收集器使用System.gc();运行,使所有文件都可删除。

答案 2 :(得分:0)

确保您没有像BufferedReader / Writer,FileReader / Writer等那样的开放流。首先关闭它们,然后您应该能够删除该文件。 还有一点,例如如果您通过FileReader等其他阅读器打开BufferedReader,则必须单独关闭两个阅读器。

所以不要这样:

BufferedReader reader = new BufferedReader(new FileReader(new File(filePath)););

这样做:

BufferedReader bufferedReader = null;
FileReader fileReader = null;

try{
    fileReader = new FileReader(readFile);
    bufferedReader = new BufferedReader(fileReader);

}catch{...}

...

try {
    fileReader.close();
    bufferedReader .close();
    readFile.delete();
} catch (IOException e) {
    e.printStackTrace();
}