我有以下Java代码,它遍历目录中的所有文件并删除它们。Java File.delete()不会删除所有文件
for(File file : tmpDir.listFiles())
{
file.delete();
}
但它不会删除所有文件。一些人,通常20-30,几千人,当我这样做时,被留下。是否有可能解决这个问题,还是我偶然发现了一些最好的单独的Java巫术?
我有以下Java代码,它遍历目录中的所有文件并删除它们。Java File.delete()不会删除所有文件
for(File file : tmpDir.listFiles())
{
file.delete();
}
但它不会删除所有文件。一些人,通常20-30,几千人,当我这样做时,被留下。是否有可能解决这个问题,还是我偶然发现了一些最好的单独的Java巫术?
强制垃圾回收器运行使用System.gc();
使所有文件都可以删除。
这是一个解决方案,但这样做“没问题”吗? – Mafro34
我有这个问题,直到我发现我忘记关闭的文件。像往常一样,如果我发现我必须收集垃圾才能获得所需的行为,那么我就有资源泄漏。 –
但是调用System.gc();不保证垃圾收集暂时发生。 –
它返回一个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他们的建议:
注意的是,文件类定义的删除方法抛出一个 IOException异常时,文件不能被删除。这对报告错误 以及诊断文件无法删除的原因很有用。
假设您使用的是Java 7。该方法抛出一个数字,你可以处理的异常:从Oracle tutorial page采取
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);
}
例。
我不明白为什么人们喜欢这个。它不回答OP的问题,它更适合评论。 –
大概在那里得到了一半 – clwhisk
我试过了,但它永远不会返回false,所以在删除文件时没有“错误”。当循环迭代并删除它们时,好像文件没有被看到。 – user1049697
请确保您没有像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();
}
也许你没有删除该文件的权限。或者它被锁定,或者被重新创建或其他东西。检查返回值以确定删除是否成功)。还要考虑目录必须是空的才能被删除。 –
有什么错误?哪些文件没有被删除? – WhileTrueSleep
您确定可以手动删除所有文件吗?可能有些被其他程序使用。尝试捕获异常:_“请注意,Files类定义了在文件无法删除时抛出IOException的delete方法,这对于错误报告和诊断为什么无法删除文件很有用。”_ –