2010-10-17 6 views
75

J'essaie d'obtenir (pas imprimer, c'est facile) la liste des fichiers dans un répertoire et ses sous-répertoires.Obtenez une liste de tous les fichiers dans un répertoire (récursif)

J'ai essayé:

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

Je ne reçois les dirs. J'ai également essayé

def files = [];  

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure); 

mais "fichiers" n'est pas reconnu dans le cadre de la fermeture.

Comment obtenir la liste?

Répondre

150

Ce code fonctionne pour moi:

import groovy.io.FileType 

def list = [] 

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

Ensuite la variable de liste contient tous les fichiers (java.io.File) du répertoire donné et ses sous-répertoires:

list.each { 
    println it.path 
} 
+11

Par défaut, les importations groovy java.io mais pas groovy.io donc d'utiliser FileType vous devez avoir importer explicitement. –

+2

Pour utiliser FileType, assurez-vous d'utiliser la bonne version groovy: "la classe groovy.io.FileType a été introduite dans Groovy version 1.7.1." voir: http://stackoverflow.com/questions/6317373/unable-to-resolve-class-groovy-io-filetype-error –

+0

Ceci affichait les noms de dossier avec son chemin. Par exemple: '/ tmp/directory1' Comment obtenir le' directory1' seul dans la sortie –

5

Si cette aide quelqu'un d'autre, ce qui suit fonctionne pour moi dans Gradle/Groovy pour build.gradle pour un projet Android, sans avoir à importer groovy.io.FileType (NOTE: Ne pas recurse sous-répertoires, mais quand j'ai trouvé cette solution, je ne tenais plus à la récursivité, donc vous ne pouvez pas non plus):

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

bien que cela ne se répète probablement pas dans les sous-répertoires. Cependant: travaillé pour mes fins de séparer les fichiers proguard et de les importer tous en même temps :) – ChrisPrime

+0

Malheureusement, cela ne répond pas à la question "tous les fichiers dans un répertoire (récursif)". Il ne listera que le répertoire courant et est trompeur dans le contexte. – ottago

+0

'fileTree' récursive. –

7

Les nouvelles versions de Groovy (1.7.2+) offrent une extension pour parcourir plus JDK facilement sur les fichiers dans un répertoire, par exemple:

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

Voir aussi [1] pour plus d'exemples.

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