Comment obtenir la liste récursive de tous les fichiers d'un dossier en Java?
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;
}
});
}
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.
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
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();
}});
}
}
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:\
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;
}
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.