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