2008-10-09 20 views
54

¿Cómo puedo obtener una lista recursivamente de todos los archivos dentro de una carpeta en Java?¿Cómo escanear una carpeta en Java?

+0

¿A qué te refieres con TREE? por favor, reformule su pregunta si está buscando un método para LISTA de todos los archivos dentro de una carpeta (recursivamente). –

+0

@ PeterPerháč esta pregunta tiene 4 años .. :) gracias – Lipis

Respuesta

62

No estoy seguro de cómo se desea representar el árbol? De todos modos, aquí hay un ejemplo que escanea todo el subárbol utilizando la recursión. Los archivos y directorios son tratados por igual. Tenga en cuenta que File.listFiles() devuelve nulo para no directorios.

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 ofrece un par de mejoras. Por ejemplo, DirectoryStream proporciona un resultado a la vez: la persona que llama ya no tiene que esperar a que se completen todas las operaciones de E/S antes de actuar. Esto permite actualizaciones incrementales GUI, cancelación anticipada, 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); 
      } 
     } 
    } 
} 

en cuenta que el valor de retorno nula temido ha sido sustituido por IOException.

Java 7 también ofrece una 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; 
     } 
    }); 
} 
+0

No recuerdo cuántas veces escribí este código. :-P – marcospereira

+3

Sí, es como una pesadilla recurrente ..: P ~ – volley

+0

Tengo que aceptar esta respuesta ya que pedí el árbol (había aceptado la respuesta de Oscar Reyes primero) ... aunque agregué una línea más para la recursión no fue tan difícil :) – Lipis

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

Muestra indistintamente archivos y carpetas.

Consulte los métodos de la clase de archivos para ordenarlos o evitar directorio de impresión, etc.

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

18

Salida Apache Commons FileUtils (listFiles, iterateFiles, etc.). Buenos métodos de conveniencia para hacer lo que quiere y también aplicar filtros.

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

+2

No hay nada como chupar una biblioteca gigantesca para resolver un problema más lentamente de lo que podría resolverse con 10 líneas de código. – stu

+11

Ya, odio usar bibliotecas que han sido probadas tanto que contienen funciones de más de 10 líneas de longitud. – cmcginty

0

En JDK7, "más NIO características" debe tener métodos para aplicar el patrón de visitante sobre un árbol de archivos o simplemente el contenido inmediato de un directorio - no es necesario encuentre todos los archivos en un directorio potencialmente enorme antes de iterar sobre ellos.

+0

pero ¿es NIO más rápido? – Pacerier

+0

@Pacerier Para directorios pequeños no debería hacer mucha diferencia.Ahora estoy menos familiarizado con la implementación que hace nueve años, pero la transmisión de NIO debería ser mejor para manejar directorios * masivos * que para leer todo de una vez. Habiendo dicho eso, la memoria ahora será varias docenas de veces más barata. –

6

También puede usar la interfaz FileFilter para filtrar lo que desee. Se utiliza mejor cuando se crea una clase anónima que lo implementa:

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

visualizar la estructura de árbol era la forma más conveniente para mí:

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

Aquí DIR es el directorio que va a escanear . p. ej. c: \

Cuestiones relacionadas