Ich hatte die Möglichkeit, den Prozess des rekursiven Löschens des Verzeichnisses zu implementieren, dh den Prozess, der in Java "rm -rf" entspricht, sodass ich eine Notiz hinterlassen werde (´ ・ ω ・ `), die nicht auf diesen Prozess beschränkt ist Files.walkTree
ist nützlich, wenn Sie Verzeichnisse rekursiv verarbeiten möchten. Files.walkTree
implementiert einfach die rekursive Verarbeitung, indem der Pfad des zu verarbeitenden Verzeichnisses im ersten Argument und FileVisitor
angegeben werden, der das Verhalten definiert, wenn eine Datei oder ein Verzeichnis im zweiten Argument erkannt wird. können.
Jetzt ist "FileVisitor" eine Schnittstelle, die die Implementierung von vier Methoden erfordert. Wenn Sie jedoch die "SimpleFileVisitor" -Klasse erben, können Sie den Zweck leicht erreichen, indem Sie einfach die erforderlichen Methoden überschreiben. Sie können beispielsweise einen "FileVisitor" erstellen, der alle Dateien und Verzeichnisse löscht, während Sie die Verzeichnisse rekursiv durchlaufen:
RemoveRecurseFileVisitor.java
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class RemoveRecurseFileVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
return delete(file);
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
return delete(dir);
}
private FileVisitResult delete(Path path) {
try {
Files.deleteIfExists(path);
System.out.printf("removed '%s'%n", path);
return FileVisitResult.CONTINUE;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
Verschieben wir nun den erstellten Code. Führen Sie zunächst die folgenden Befehlsreihen der Reihe nach aus.
mkdir -p dir01/dir02/dir03
touch dir01/file1
touch dir01/dir02/file2
touch dir01/dir02/file3
touch dir01/dir02/dir03/file4
touch dir01/dir02/dir03/file5
touch dir01/dir02/dir03/file6
Dadurch sollte eine Verzeichnisdatei erstellt werden, die der folgenden ähnelt:
$ find dir1/ -exec stat -c '%n (%F)' {} \;
dir1/ (directory)
dir1/dir2 (directory)
dir1/dir2/dir3 (directory)
dir1/dir2/dir3/txt4 (regular empty file)
dir1/dir2/dir3/txt5 (regular empty file)
dir1/dir2/dir3/txt6 (regular empty file)
dir1/dir2/txt2 (regular empty file)
dir1/dir2/txt3 (regular empty file)
dir1/txt1 (regular empty file)
Verwenden Sie nun "RemoveRecurseFileVisitor", um "Main.java" zu erstellen, mit der "dir1" und die darunter liegenden Dateien und Verzeichnisse entfernt werden.
Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws IOException {
var target = Paths.get("dir1");
Files.walkFileTree(target, new RemoveRecurseFileVisitor());
}
}
Wenn Sie dies kompilieren und ausführen, sollten Sie danach bestätigen können, dass das Löschprotokoll zuerst an die Standardausgabe ausgegeben wird (´ ・ ω ・ `).
removed 'dir1\dir2\dir3\txt4'
removed 'dir1\dir2\dir3\txt5'
removed 'dir1\dir2\dir3\txt6'
removed 'dir1\dir2\dir3'
removed 'dir1\dir2\txt2'
removed 'dir1\dir2\txt3'
removed 'dir1\dir2'
removed 'dir1\txt1'
removed 'dir1'
Sie können bestätigen, dass das Verzeichnis "dir1" und alles darunter mit einem Befehl wie dem folgenden gelöscht wurden.
$ ls -l dir1
ls: cannot access 'dir1': No such file or directory
Referenz: https://docs.oracle.com/javase/tutorial/essential/io/walk.html
Recommended Posts