web-dev-qa-db-fra.com

Comment numériser un dossier en Java?

Comment obtenir la liste récursive de tous les fichiers d'un dossier en Java?

58
Lipis

Vous ne savez pas comment vous voulez représenter l'arbre? Quoi qu'il en soit, voici un exemple qui analyse l'ensemble du sous-arbre à l'aide de la récursivité. Les fichiers et les répertoires sont traités de la même manière. Notez que File.listFiles () renvoie 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 à attendre la fin de toutes les opérations d'E/S 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 valeur de retour nulle redoutée a été remplacée par IOException.

Java 7 propose également un arborescence :

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;
        }
    });
}
71
volley
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 dossiers.

Voir les méthodes de la classe File pour les commander ou éviter l'impression de répertoire, etc.

http://Java.Sun.com/javase/6/docs/api/Java/io/File.html

21
OscarRyz

Consultez Apache Commons FileUtils (listFiles, iterateFiles, etc.). De belles méthodes pratiques pour faire ce que vous voulez et appliquer des filtres.

http://commons.Apache.org/io/api-1.4/org/Apache/commons/io/FileUtils.html

18
Brandon DuRette

Vous pouvez également utiliser l'interface FileFilter pour filtrer ce que vous voulez. Il est préférable de l'utiliser 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();
            }});
    }
}
6
Leonel
public static void directory(File dir) {
    File[] files = dir.listFiles();
    for (File file : files) {
        System.out.println(file.getAbsolutePath());
        if (file.listFiles() != null)
            directory(file);        
    }
} 

Ici dir est le répertoire à analyser. par exemple. c:\

2
Rohit sharma

Visualiser la structure arborescente était pour moi le moyen le plus pratique:

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;
}
1
Ohad Dan

Dans JDK7, "plus de fonctionnalités NIO" devraient avoir des méthodes pour appliquer le modèle de visiteur sur une arborescence de fichiers ou simplement le contenu immédiat d'un répertoire - pas besoin de trouver tous les fichiers dans un répertoire potentiellement énorme avant de les parcourir.

0