2010-10-17 11 views
75

Estoy tratando de obtener (no imprimir, eso es fácil) la lista de archivos en un directorio y sus subdirectorios.Obtener una lista de todos los archivos en un directorio (recursivo)

que he probado:

def folder = "C:\\DevEnv\\Projects\\Generic"; 
def baseDir = new File(folder); 
files = baseDir.listFiles(); 

solo me dan los directorios. También probé

def files = [];  

def processFileClosure = { 
     println "working on ${it.canonicalPath}: " 
     files.add (it.canonicalPath);     
    } 

baseDir.eachFileRecurse(FileType.FILES, processFileClosure); 

pero "archivos" no se reconoce en el alcance del cierre.

¿Cómo obtengo la lista?

Respuesta

150

Este código funciona para mí:

import groovy.io.FileType 

def list = [] 

def dir = new File("path_to_parent_dir") 
dir.eachFileRecurse (FileType.FILES) { file -> 
    list << file 
} 

Posteriormente, la variable de lista contiene todos los archivos (java.io.File) del directorio dado y sus subdirectorios:

list.each { 
    println it.path 
} 
+11

Por defecto, las importaciones maravilloso java.io pero no groovy.io por lo que utilizan FileType debe haber explícitamente importarlo. –

+2

Para usar FileType, asegúrese de utilizar la versión groovy correcta: "la clase groovy.io.FileType se introdujo en la versión 1.7.1 de Groovy". ver: http://stackoverflow.com/questions/6317373/unable-to-resolve-class-groovy-io-filetype-error –

+0

Esto mostraba los nombres de las carpetas junto con su ruta. Por ejemplo: '/ tmp/directory1' Cómo obtener el' directorio1' solo en la salida –

5

En caso de que esto ayuda Alguien más, lo siguiente me funciona en Gradle/Groovy para build.gradle para un proyecto de Android, sin tener que importar groovy.io.FileType (NOTA: no recurre a los subdirectorios pero cuando encontré esta solución ya no me importaba la recursión, por lo que tampoco puede):

 FileCollection proGuardFileCollection = files { file('./proguard').listFiles() } 
     proGuardFileCollection.each { 
      println "Proguard file located and processed: " + it 
     } 
+1

aunque esto probablemente no se repita a través de subdirectorios. Sin embargo: funcionó para mis propósitos al separar los archivos de proguard y al importarlos todos a la vez :) – ChrisPrime

+0

Desafortunadamente, esto no responde a la pregunta "todos los archivos en un directorio (recursivo)". Solo mostrará el directorio actual y es engañoso en el contexto. – ottago

+0

'fileTree' recurses. –

7

Las nuevas versiones de Groovy (1.7.2+) ofrecen una extensión de JDK para atravesar más fácilmente a través de archivos en un directorio, por ejemplo:

import static groovy.io.FileType.FILES 
def dir = new File("."); 
def files = []; 
dir.traverse(type: FILES, maxDepth: 0) { files.add(it) }; 

ver también [1] para más ejemplos.

[1] http://mrhaki.blogspot.nl/2010/04/groovy-goodness-traversing-directory.html

Cuestiones relacionadas