Implémentez rm -rf en Java.

J'ai eu la chance d'implémenter le processus de suppression récursive du répertoire, c'est-à-dire le processus équivalent à rm -rf en Java, donc je vais laisser une note (´ ・ ω ・ `) Non limité à ce processus Files.walkTree est utile si vous souhaitez traiter les répertoires de manière récursive. Files.walkTree implémente facilement le traitement récursif en donnant le chemin du répertoire à traiter dans le premier argument et FileVisitor qui définit le comportement lorsqu'un fichier ou un répertoire est détecté dans le deuxième argument. pouvez.

Maintenant, FileVisitor est une interface qui nécessite l'implémentation de quatre méthodes, mais si vous héritez de la classe SimpleFileVisitor, vous pouvez facilement atteindre l'objectif en remplaçant simplement les méthodes requises. Par exemple, vous pouvez créer un FileVisitor qui supprime tous les fichiers et répertoires tout en parcourant les répertoires de manière récursive:

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

Maintenant, déplaçons réellement le code créé. Tout d'abord, exécutez la série de commandes suivante dans l'ordre.

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

Cela devrait créer un fichier de répertoire semblable au suivant:

$ 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)

Maintenant, utilisez RemoveRecurseFileVisitor pour créer Main.java qui supprime dir1 et les fichiers et répertoires en dessous.

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

Après cela, si vous compilez et exécutez ceci, vous devriez être en mesure de confirmer que le journal de suppression est d'abord sorti sur la sortie standard (´ ・ ω ・ `)

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'

Vous pouvez confirmer que le répertoire dir1 et tout ce qu'il contient ont été supprimés avec une commande comme celle-ci.

$ ls -l dir1
ls: cannot access 'dir1': No such file or directory

Référence: https://docs.oracle.com/javase/tutorial/essential/io/walk.html

Recommended Posts

Implémentez rm -rf en Java.
Implémentation de l'authentification en deux étapes en Java
Implémenter l'authentification de base en Java
Implémenter une combinaison de mathématiques en Java
2 Implémentez une analyse syntaxique simple en Java
Implémenter l'envoi d'e-mails en Java
Implémenter la signature XML en Java
3 Implémentez un interpréteur simple en Java
Implémenter reCAPTCHA v3 dans Java / Spring
Implémenter la fonction PHP implode en Java
Essayez d'implémenter Yuma en Java
1 Implémentez une analyse de phrase simple en Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Implémenter l'autorisation API Gateway Lambda dans Java Lambda
Partition en Java
Essayez d'implémenter l'ajout n-aire en Java
Changements dans Java 11
Janken à Java
Comment appliquer les conventions de codage en Java
Implémenter quelque chose comme une pile en Java
Taux circonférentiel à Java
FizzBuzz en Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Commentaires dans la source Java
Fonctions Azure en Java
Formater XML en Java
Implémentation Boyer-Moore en Java
Hello World en Java
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Exprimer l'échec en Java
Implémenter CustomView dans le code
Créer JSON en Java
Manipulation de la date dans Java 8
Nouveautés de Java 8
Utiliser PreparedStatement en Java
Nouveautés de Java 9,10,11
Exécution parallèle en Java
Markdown implémenté dans Rails
J'ai essayé d'implémenter la notification push Firebase en Java
Implémentez rapidement singleton avec enum en Java
Résumé de la mise en œuvre des arguments par défaut en Java