Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java File.delete() does not delete all files

I have the following Java code which iterates through all the files in a directory and deletes them.

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

It does however not delete all files. Some, usually 20-30, out of a couple of thousand, are left behind when I do this. Is it possible to fix this, or have I stumbled upon some Java voodoo that is best left alone?

like image 641
user1049697 Avatar asked Dec 09 '22 11:12

user1049697


1 Answers

It returns a boolean value, you should check that. From the JavaDoc:

Returns: true if and only if the file or directory is successfully deleted; false otherwise

You should check the value of the return and take action.

If it returns false it may well be that you do not have permission to delete the file.

In that case you can check whether the file is writeable by the application and if not attempt to make it writeable - again this returns a boolean. If successful you can try deleting again.

You could use a utility method:

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.");
    }
}

I would also take their advice in the JavaDoc:

Note that the Files class defines the delete method to throw an IOException when a file cannot be deleted. This is useful for error reporting and to diagnose why a file cannot be deleted.

Provided that you are using Java 7 that is. That method throws a number of exceptions that you can handle:

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);
}

Example taken from the Oracle tutorial page.

like image 114
Boris the Spider Avatar answered Dec 26 '22 20:12

Boris the Spider