Wie scanne ich einen Ordner in Java?

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

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

public static void main(String[] args) { Collection all = new ArrayList(); addTree(new File("."), all); System.out.println(all); } static void addTree(File file, Collection all) { File[] children = file.listFiles(); if (children != null) { for (File child : children) { all.add(child); addTree(child, all); } } } 

Java 7 bietet ein paar Verbesserungen. Beispiel: DirectoryStream stellt jeweils ein Ergebnis zur Verfügung – der Aufrufer muss nicht mehr auf den Abschluss aller E / A-Vorgänge warten, bevor er reactjs. Dies ermöglicht inkrementelle GUI-Updates, frühzeitige Stornierung usw.

 static void addTree(Path directory, Collection all) throws IOException { try (DirectoryStream ds = Files.newDirectoryStream(directory)) { for (Path child : ds) { all.add(child); if (Files.isDirectory(child)) { addTree(child, all); } } } } 

Beachten Sie, dass der gefürchtete Null-Rückgabewert durch IOException ersetzt wurde.

Java 7 bietet auch einen Baumwanderer :

 static void addTree(Path directory, final Collection all) throws IOException { Files.walkFileTree(directory, new SimpleFileVisitor() { @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() ); } } } 

Es zeigt undeutlich Dateien und Ordner an.

Sehen Sie sich die Methoden in der File-class an, um sie zu sortieren oder Verzeichnisausdruck usw. zu vermeiden.

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

Überprüfen Sie Apache Commons FileUtils (listFiles, iterateFiles, etc.). Schöne Convenience-Methoden, um das zu tun, was Sie wollen und Filter anwenden.

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

Sie können auch die FileFilter Oberfläche verwenden, um das herauszufiltern, was Sie möchten. Es wird am besten verwendet, wenn Sie eine anonyme class erstellen, die es 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(); }}); } } 
 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 Verzeichnis, das gescannt werden soll. zB c:\

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

In JDK7 sollten “mehr NIO-functionen” über Methoden verfügen, um das Besuchermuster auf eine Dateistruktur oder nur den unmittelbaren Inhalt eines Verzeichnisses anzuwenden – es müssen nicht alle Dateien in einem potenziell riesigen Verzeichnis gefunden werden, bevor darüber iteriert wird.