it-swarm.com.de

Wie scanne ich einen Ordner in Java?

Wie kann ich in Java alle Dateien in einem Ordner rekursiv auflisten lassen?

58
Lipis

Nicht sicher, wie Sie den Baum darstellen möchten? Jedenfalls ist hier ein Beispiel, das den gesamten Teilbaum unter Verwendung von Rekursion abtastet. Dateien und Verzeichnisse werden gleich behandelt. Beachten Sie, dass File.listFiles () für Nicht-Verzeichnisse null zurückgibt.

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 bietet einige Verbesserungen. Beispiel: DirectoryStream liefert jeweils ein Ergebnis - der Aufrufer muss nicht mehr auf den Abschluss aller E/A-Vorgänge warten, bevor er tätig wird. Dies ermöglicht inkrementelle GUI-Updates, vorzeitige Stornierung usw.

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

Beachten Sie, dass der gefürchtete Nullrückgabewert durch IOException ersetzt wurde.

Java 7 bietet auch einen Tree Walker :

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

Es zeigt undeutliche Dateien und Ordner an.

Sehen Sie sich die Methoden in der File-Klasse an, um sie zu bestellen oder das Drucken von Verzeichnissen usw. zu vermeiden.

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

21
OscarRyz

Checken Sie Apache Commons FileUtils aus (listFiles, iterateFiles, etc.). Praktische Methoden, um das zu tun, was Sie wollen, und auch um Filter anzuwenden.

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

18
Brandon DuRette

Sie können auch die Schnittstelle FileFilter verwenden, um herauszufiltern, was Sie möchten. Es wird am besten verwendet, wenn Sie eine anonyme Klasse erstellen, die diese implementiert:

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

Hier ist dir das zu durchsuchende Verzeichnis. z.B. c:\

2
Rohit sharma

Die Visualisierung der Baumstruktur war für mich der bequemste Weg:

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

In JDK7 sollten "Weitere NIO-Funktionen" Methoden enthalten, mit denen das Besuchermuster über einen Dateibaum oder nur über den unmittelbaren Inhalt eines Verzeichnisses angewendet werden kann. Sie müssen nicht alle Dateien in einem potenziell großen Verzeichnis finden, bevor Sie darüber iterieren.