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

93

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 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?

Yossale
fuente

Respuestas:

213

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
}

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

list.each {
  println it.path
}
Christoph Metzendorf
fuente
15
De forma predeterminada, groovy importa java.io pero no groovy.io, por lo que para usar FileType debe importarlo explícitamente.
Chris Mountford
4
Para usar FileType, asegúrese de utilizar la versión maravillosa correcta: "la clase groovy.io.FileType se introdujo en la versión 1.7.1 de Groovy". ver: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach
Esto mostraba los nombres de las carpetas junto con su ruta. Por ejemplo: /tmp/directory1Cómo obtener el directory1solo en la salida
soundararajan.c
raro ... esto da la ruta raíz incluso si lo ././path
prefiero
¿Cómo puedo enumerar todas las carpetas del directorio?
Carlos Andres
18

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

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

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

Oscar Scholten
fuente
6

Lo siguiente me funciona en Gradle / Groovy para build.gradleun proyecto de Android, sin tener que importar groovy.io.FileType(NOTA: No tiene subdirectorios recurrentes, pero cuando encontré esta solución, ya no me importaba la recursividad, por lo que es posible que a ti tampoco):

FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
    println "Proguard file located and processed: " + it
}
ChrisPrime
fuente
1
aunque esto probablemente no se repita a través de subdirectorios. Sin embargo: funcionó para mis propósitos para separar los archivos proguard e importarlos todos a la vez :)
ChrisPrime
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
fileTreerecurre.
Noel Yap
FileTreeno incluye directorios (no los trata como archivos).
DNax
1

Esto es lo que se me ocurrió para un script de compilación de Gradle:

task doLast {
    ext.FindFile = { list, curPath ->
        def files = file(curPath).listFiles().sort()

        files.each {  File file ->

            if (file.isFile()) {
                list << file
            }
            else {
                list << file  // If you want the directories in the list

                list = FindFile( list, file.path) 
            }
        }
        return list
    }

    def list = []
    def theFile = FindFile(list, "${project.projectDir}")

    list.each {
        println it.path
    }
}
Timothy Strunk
fuente
El uso de la lista se tomó de IDEA anterior. El problema con los scripts anteriores es que requieren importar groovy.io.FileType.FILES. A los scripts de Gradle no les gusta eso. Así que acabo de crear un método para buscar los archivos que se llaman a sí mismos cuando se encuentra un directorio.
Timothy Strunk