62 votes

Comment scanner un dossier en Java ?

Comment puis-je obtenir la liste de tous les fichiers d'un dossier de manière récursive en Java ?

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

74voto

volley Points 3229

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

3 votes

Oui, c'est comme un cauchemar récurrent :P~

0 votes

Je dois accepter cette réponse puisque j'ai demandé l'arbre (j'avais d'abord accepté la réponse d'Oscar Reyes) même si ajouter une ligne supplémentaire pour la récursion n'était pas si difficile :)

23voto

OscarRyz Points 82553
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.

http://java.sun.com/javase/6/docs/api/java/io/File.html

18voto

Brandon DuRette Points 3034

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

3 votes

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.

12 votes

Ya, je déteste utiliser des bibliothèques qui ont été tellement testées qu'elles contiennent des fonctions de plus de 10 lignes.

6voto

Leonel Points 8174

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

1voto

Ohad Dan Points 359

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.com

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.

Powered by:

X