Hallo Leute,
dies ist vielmehr eine Feststellung als eine Frage, aber vielleicht gibt es dennoch ein paar Ideen dazu:
Ich nutze die neue Java7-API zum rekursiven Löschen von Verzeichnissen über den FileVisitor:
Das klappt ach soweit jedoch kommt in unregelmäßigen Fällen - meistens dann wenn es sehr viel zu löschen gibt - eine Ausnahme:
Klar, er kann ein Verzeichnis nicht löschen, weil es noch Dateien darin gibt. Wie man am auskommentierten Code sieht, habe ich es mal versuchweise mit Warten probiert. Damit funktioniert das Löschen (bisher) immer. Meine Vermutung also: Der FileVisitor ist schneller als das Dateisystem.
Vielleicht hat jemand Ideen wie man das "schöner" lösen kann? Es ist zugegebenermaßen mehr Versuchscode und ich will es auch nochmal mit dem klassischen File.delete() probieren.
dies ist vielmehr eine Feststellung als eine Frage, aber vielleicht gibt es dennoch ein paar Ideen dazu:
Ich nutze die neue Java7-API zum rekursiven Löschen von Verzeichnissen über den FileVisitor:
Java:
public final class TestDeletion {
public static void main(String[] args) throws IOException {
final Path baseDir = Paths.get("d:", "test-workspace", "ProjectManager", "cvs", "ADS");
final FileVisitor<Path> deleter = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (exc == null) {
// try {
// Thread.sleep(500L);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
else {
throw exc;
}
}
};
// Löschen ausführen
Files.walkFileTree(baseDir, deleter);
}
}
Das klappt ach soweit jedoch kommt in unregelmäßigen Fällen - meistens dann wenn es sehr viel zu löschen gibt - eine Ausnahme:
Code:
Exception in thread "main" java.nio.file.DirectoryNotEmptyException: d:\test-workspace\ProjectManager\cvs\ADS
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:264)
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
at java.nio.file.Files.delete(Files.java:1071)
at test.TestDeletion $1.postVisitDirectory(TestDeletion.java:37)
Klar, er kann ein Verzeichnis nicht löschen, weil es noch Dateien darin gibt. Wie man am auskommentierten Code sieht, habe ich es mal versuchweise mit Warten probiert. Damit funktioniert das Löschen (bisher) immer. Meine Vermutung also: Der FileVisitor ist schneller als das Dateisystem.
Vielleicht hat jemand Ideen wie man das "schöner" lösen kann? Es ist zugegebenermaßen mehr Versuchscode und ich will es auch nochmal mit dem klassischen File.delete() probieren.