4

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

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

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

4

3 回答 3

11

它返回一个boolean值,你应该检查一下。从JavaDoc

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

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

如果它返回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 教程页面

于 2013-11-02T17:23:37.257 回答
3

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

于 2013-11-07T11:02:44.213 回答
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();
}
于 2017-11-17T10:16:17.130 回答