Obtener una lista de todos los archivos en un directorio (recursivo)


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

He intentado:

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

Solo obtengo los directorios. También he intentado:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Pero "files" no se reconoce en el ámbito del cierre.

¿Cómo obtengo la lista?

 80
Author: Peter Mortensen, 2010-10-17

3 answers

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
}

Después la variable list contiene todos los archivos (java. io. File) del directorio dado y sus subdirectorios:

list.each {
  println it.path
}
 177
Author: Christoph Metzendorf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-17 18:30:07

Las versiones más recientes de Groovy (1.7.2+) ofrecen una extensión JDK para recorrer más fácilmente los 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

 8
Author: Oscar Scholten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 12:18:46

Lo siguiente funciona para mí en Gradle / Groovy para build.gradle para un proyecto Android, sin tener que importar groovy.io.FileType (NOTA: No recurse subdirectorios, pero cuando encontré esta solución ya no me importaba la recursión, por lo que tampoco puede ser):

FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
    println "Proguard file located and processed: " + it
}
 5
Author: ChrisPrime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-05 21:41:26