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?

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
}

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


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
}

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.