2010-10-29 13 views
8

Ok, esto debería ser fácil ...maravilloso (Archivo IO): encontrar todos los archivos y devolver todos los ficheros - la forma maravillosa

Soy nuevo en Groovy y estoy mirando para poner en práctica la siguiente lógica:

def testFiles = findAllTestFiles(); 

Hasta ahora, he encontrado el siguiente código que imprime con éxito todos los nombres de archivos. Sin embargo, en lugar de imprimir, solo necesito ponerlos en una colección. Por supuesto, podría hacer esto a la antigua usanza de Java: simplemente crear una colección de instancias, agregar todos los elementos y devolverlos. Sin embargo, eso no me enseñaría nada.

Entonces, ¿cómo se hace esto la forma genial, "Groovy"?

static File[] findAllTestFiles() { 
    def directory = new File("src/test/java"); 
    def closure = {File f -> if(f.name =~ /Test\.java$/) println f } 
    directory.eachFileRecurse FileType.FILES, closure 
    return null; 
} 

Estoy mirando para poner en práctica findAlltestFiles() en Groovy utilizando como poco código como sea posible sin dejar de ser legible.

Respuesta

12

que iba a tratar de evitar la construcción de la colección en su totalidad. El uso de cierres, se puede separar la lógica para seleccionar los archivos de lo que realmente quiere hacer con ellos, así:

import groovy.io.FileType 

def withEachTestFile(Closure closure) { 
    new File("src/test/java").eachFileRecurse(FileType.FILES) { 
     if (it.name =~ /Test\.java$/) { 
      closure.call(it) 
     } 
    } 
} 

Entonces, si usted quiere hacer algo en los archivos de prueba, puede hacerlo directamente sin la creación de una lista en la memoria:

withEachTestFile() { println it } 

o si realmente desea la lista, puede generar fácilmente, utilizando cualquier colección tiene sentido:

def files = [] 
withEachTestFile() { files << it } 
+0

Siento que realmente necesito la lista de archivos, pero probablemente estoy equivocado (ya que esta es mi primera clase de Groovy, nunca). Consideraré su primera sugerencia más a fondo, parece una ** gran ** visión. Voy a tener que jugar con esto para comprender completamente lo que estás diciendo y cómo aplicarlo: ¡esta es una manera completamente diferente de pensar las cosas! Me gusta ... Groovy está creciendo en mí, rápido. – gMale

+0

He vuelto a escribir toda la secuencia de comandos, tratando de diseñar con * cierres * en mente. A veces, todavía me duele un poco la cabeza pensarlo profundamente. Pero estoy vendido en Groovy así que conseguiré algunos libros y comenzaré a dominar este nuevo enfoque. Estoy emocionado de aprender a usar Groovy Console ... gracias por tu ayuda. – gMale

2

algo como esto debería funcionar

def files = [] 
new File("src/test/java").eachFileRecurse(FILES) { 
    if(it.name =~ /Test\.java$/)) { 
     println f 
     files << f 
    } 
} 

o Creo que modificar su código como este

static File[] findAllTestFiles() { 
    def files = [] 
    def directory = new File("src/test/java"); 
    def closure = {File f -> if(f.name =~ /Test\.java$/) {println f; files << f} } 
    directory.eachFileRecurse FileType.FILES, closure 
    return files; 
} 
+0

gracias! su respuesta fue al grano y muy útil. ¡Ojalá pudiera también otorgarte puntos por la respuesta correcta! Gracias por tomarse el tiempo para ayudar. – gMale

2

el siguiente es no probado, b ut el método findAll debería ayudar a que su código muy concisa:

List<File> files = new File("src/test/java").listFiles().findAll { it.name =~ /Test\.java$/ } 
10

Una forma más reciente, estándar y más genérico para atravesar un directorio que soporta múltiples servicios repetidos de cierre es traverse.

import static groovy.io.FileType.FILES 
... 
def files = [] 
new File("src/test/java").traverse(type: FILES, nameFilter: ~/Test\.java$/) { 
    files << it  
} 
Cuestiones relacionadas