Vous pouvez utiliser [File#isDirectory()
](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#isDirectory()) pour tester si le fichier donné (chemin) est un répertoire. Si c'est true
, alors vous appelez simplement à nouveau la même méthode avec son résultat [File#listFiles()
](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#listFiles()). C'est ce qu'on appelle la récursivité.
Voici un exemple de départ de base :
package com.stackoverflow.q3154488;
import java.io.File;
public class Demo {
public static void main(String... args) {
File dir = new File("/chemin/vers/repertoire");
showFiles(dir.listFiles());
}
public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Répertoire : " + file.getAbsolutePath());
showFiles(file.listFiles()); // Appelle à nouveau la même méthode.
} else {
System.out.println("Fichier : " + file.getAbsolutePath());
}
}
}
}
Remarquez que cela est sensible à StackOverflowError
lorsque l'arborescence est plus profonde que la pile JVM ne peut contenir. Si vous êtes déjà sur Java 8 ou plus récent, alors il vaut mieux utiliser Files#walk()
qui utilise la récursion terminale :
package com.stackoverflow.q3154488;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class DemoWithJava8 {
public static void main(String... args) throws Exception {
Path dir = Paths.get("/chemin/vers/repertoire");
Files.walk(dir).forEach(path -> showFile(path.toFile()));
}
public static void showFile(File file) {
if (file.isDirectory()) {
System.out.println("Répertoire : " + file.getAbsolutePath());
} else {
System.out.println("Fichier : " + file.getAbsolutePath());
}
}
}