Comment puis-je obtenir la liste de tous les fichiers d'un dossier de manière récursive en Java ?
Oui, c'est comme un cauchemar récurrent :P~
Comment puis-je obtenir la liste de tous les fichiers d'un dossier de manière récursive en Java ?
Vous n'êtes pas sûr de la façon dont vous voulez représenter l'arbre ? En tout cas, voici un exemple qui scanne le sous-arbre entier en utilisant la récursion. Les fichiers et les répertoires sont traités de la même manière. Notez que Fichier.listFiles() retourne null pour les non-répertoires.
public static void main(String[] args) {
Collection<File> all = new ArrayList<File>();
addTree(new File("."), all);
System.out.println(all);
}
static void addTree(File file, Collection<File> all) {
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
all.add(child);
addTree(child, all);
}
}
}
Java 7 offre quelques améliorations. Par exemple, DirectoryStream fournit un résultat à la fois - l'appelant n'a plus besoin d'attendre que toutes les opérations d'E/S soient terminées avant d'agir. Cela permet des mises à jour incrémentielles de l'interface graphique, une annulation anticipée, etc.
static void addTree(Path directory, Collection<Path> all)
throws IOException {
try (DirectoryStream<Path> ds = Files.newDirectoryStream(directory)) {
for (Path child : ds) {
all.add(child);
if (Files.isDirectory(child)) {
addTree(child, all);
}
}
}
}
Notez que la redoutable valeur de retour null a été remplacée par IOException.
Java 7 offre également une promeneur d'arbres :
static void addTree(Path directory, final Collection<Path> all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
}
import java.io.File;
public class Test {
public static void main( String [] args ) {
File actual = new File(".");
for( File f : actual.listFiles()){
System.out.println( f.getName() );
}
}
}
Il affiche indistinctement les fichiers et les dossiers.
Voir les méthodes de la classe File pour les ordonner ou éviter l'impression du répertoire, etc.
Consultez les Apache Commons FileUtils (listFiles, iterateFiles, etc.). De belles méthodes pratiques pour faire ce que vous voulez et aussi appliquer des filtres.
http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html
Il n'y a rien de tel que d'aspirer une bibliothèque gargantuesque pour résoudre un problème plus lentement que ce qui pourrait être résolu avec 10 lignes de code.
Vous pouvez également utiliser le FileFilter
pour filtrer ce que vous voulez. Elle est mieux utilisée lorsque vous créez une classe anonyme qui l'implémente :
import java.io.File;
import java.io.FileFilter;
public class ListFiles {
public File[] findDirectories(File root) {
return root.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory();
}});
}
public File[] findFiles(File root) {
return root.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isFile();
}});
}
}
La visualisation de l'arborescence était le moyen le plus pratique pour moi :
public static void main(String[] args) throws IOException {
printTree(0, new File("START/FROM/DIR"));
}
static void printTree(int depth, File file) throws IOException {
StringBuilder indent = new StringBuilder();
String name = file.getName();
for (int i = 0; i < depth; i++) {
indent.append(".");
}
//Pretty print for directories
if (file.isDirectory()) {
System.out.println(indent.toString() + "|");
if(isPrintName(name)){
System.out.println(indent.toString() + "*" + file.getName() + "*");
}
}
//Print file name
else if(isPrintName(name)) {
System.out.println(indent.toString() + file.getName());
}
//Recurse children
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++){
printTree(depth + 4, files[i]);
}
}
}
//Exclude some file names
static boolean isPrintName(String name){
if (name.charAt(0) == '.') {
return false;
}
if (name.contains("svn")) {
return false;
}
//.
//. Some more exclusions
//.
return true;
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Qu'entendez-vous par ARBRE ? veuillez reformuler votre question si vous cherchez une méthode pour LISTER tous les fichiers d'un dossier (de manière récursive).
0 votes
@PeterPerhác cette question a 4 ans :) merci