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

use*_*697 4 java delete-file

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

for(File file : tmpDir.listFiles())
{
    file.delete();
}
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*der 11

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

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

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

如果它返回,false则可能是您没有删除该文件的权限.

在这种情况下,您可以检查文件是否可由应用程序写入,如果没有尝试使其可写 - 再次返回a 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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,Files类定义了删除方法,以便在无法删除文件时抛出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);
}
Run Code Online (Sandbox Code Playgroud)

Oracle教程页面获取的示例.