FileVisitor and then calling Files.walkFileTree using the visitor. The visitor has four methods:
visitFile: Invoked for a file in a directory.visitFileFailed: Invoked for a file that could not be visited.preVisitDirectory: Invoked for a directory before entries in the directory are visited.postVisitDirectory: Invoked for a directory after entries in the directory, and all of their descendants, have been visited.
The following code shows how you can recursively delete a directory by walking the file tree. It does not follow symbolic links. I have overridden the
visitFile and postVisitDirectory methods in SimpleFileVisitor so that when a file is visited, it is deleted and after all the files in the directory have been visited, the directory is deleted.
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import static java.nio.file.FileVisitResult.*;
Path dir = Paths.get("/tmp/foo");
try {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
System.out.println("Deleting file: " + file);
Files.delete(file);
return CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) throws IOException {
System.out.println("Deleting dir: " + dir);
if (exc == null) {
Files.delete(dir);
return CONTINUE;
} else {
throw exc;
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
thanks for the handy code
ReplyDelete