我有以下Java代码,它遍历目录中的所有文件并删除它们。
for(File file : tmpDir.listFiles())
{
file.delete();
}
但是它并不能删除所有文件。通常在几千个文件中留下了20-30个文件,当我这样做时。有可能修复这个问题吗?或者我碰巧遇到了一些应该被放置的Java voodoo?
我有以下Java代码,它遍历目录中的所有文件并删除它们。
for(File file : tmpDir.listFiles())
{
file.delete();
}
但是它并不能删除所有文件。通常在几千个文件中留下了20-30个文件,当我这样做时。有可能修复这个问题吗?或者我碰巧遇到了一些应该被放置的Java voodoo?
它返回一个布尔值,你应该检查一下。从JavaDoc中得知:
返回: 如果文件或目录成功删除,则为 true;否则为 false。
你应该检查返回值并进行相应的操作。
如果返回值为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 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();
}