2013-11-02 65 views
3

我有以下Java代码,它遍历目录中的所有文件并删除它们。Java File.delete()不会删除所有文件

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

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

+2

也许你没有删除该文件的权限。或者它被锁定,或者被重新创建或其他东西。检查返回值以确定删除是否成功)。还要考虑目录必须是空的才能被删除。 –

+0

有什么错误?哪些文件没有被删除? – WhileTrueSleep

+1

您确定可以手动删除所有文件吗?可能有些被其他程序使用。尝试捕获异常:_“请注意,Files类定义了在文件无法删除时抛出IOException的delete方法,这对于错误报告和诊断为什么无法删除文件很有用。”_ –

回答

3

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

+1

这是一个解决方案,但这样做“没问题”吗? – Mafro34

+1

我有这个问题,直到我发现我忘记关闭的文件。像往常一样,如果我发现我必须收集垃圾才能获得所需的行为,那么我就有资源泄漏。 –

+0

但是调用System.gc();不保证垃圾收集暂时发生。 –

10

它返回一个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); 
} 

例。

+1

我不明白为什么人们喜欢这个。它不回答OP的问题,它更适合评论。 –

+0

大概在那里得到了一半 – clwhisk

+1

我试过了,但它永远不会返回false,所以在删除文件时没有“错误”。当循环迭代并删除它们时,好像文件没有被看到。 – user1049697

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(); 
} 
相关问题