我有以下Java代码,它遍历目录中的所有文件并删除它们。
for(File file : tmpDir.listFiles())
{
file.delete();
}
但它不会删除所有文件。当我这样做时,一些,通常是20到30,中有几千。是否有可能解决这个问题,或者我偶然发现了一些最好独自留下的Java伏都教?
答案 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);
}
的示例
答案 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();
}