Implementieren Sie rm -rf in Java.

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

Implementieren Sie rm -rf in Java.
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
Implementieren Sie die XML-Signatur in Java
3 Implementieren Sie einen einfachen Interpreter in Java
Implementieren Sie reCAPTCHA v3 in Java / Spring
Implementieren Sie die PHP-Implodierungsfunktion in Java
Versuchen Sie, Yuma in Java zu implementieren
1 Implementieren Sie eine einfache Phrasenanalyse in Java
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Partisierung in Java
Versuchen Sie, n-ary Addition in Java zu implementieren
Änderungen in Java 11
Janken in Java
So erzwingen Sie Codierungskonventionen in Java
Implementieren Sie so etwas wie einen Stack in Java
Umfangsrate in Java
FizzBuzz in Java
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Implementieren Sie CustomView im Code
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
Parallele Ausführung in Java
Markdown in Rails implementiert
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Implementieren Sie Singleton mit Enum schnell in Java
Zusammenfassung der Implementierung von Standardargumenten in Java