我有以下 Java 代码,它遍历目录中的所有文件并删除它们。
for(File file : tmpDir.listFiles())
{
file.delete();
}
但是,它不会删除所有文件。当我这样做时,会留下一些,通常是几千人中的 20-30 人。是否有可能解决这个问题,或者我偶然发现了一些最好不要管的Java voodoo?
我有以下 Java 代码,它遍历目录中的所有文件并删除它们。
for(File file : tmpDir.listFiles())
{
file.delete();
}
但是,它不会删除所有文件。当我这样做时,会留下一些,通常是几千人中的 20-30 人。是否有可能解决这个问题,或者我偶然发现了一些最好不要管的Java voodoo?
它返回一个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 教程页面。
强制垃圾收集器运行System.gc();
使所有文件都可删除。
确保您没有任何打开的流,例如 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();
}