web-dev-qa-db-fra.com

Obtenir une liste de tous les fichiers d'un répertoire (récursif)

J'essaie d'obtenir (pas d'impression, c'est facile) la liste des fichiers d'un répertoire et de ses sous-répertoires.

J'ai essayé:

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

Je ne reçois que les annuaires. J'ai aussi 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 puis-je obtenir la liste?

87
Yossale

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

Les versions les plus récentes de Groovy (1.7.2+) offrent une extension JDK pour parcourir plus facilement les fichiers d’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

12
Oscar Scholten

Ce qui suit fonctionne pour moi dans Gradle/Groovy pour build.gradle pour un projet Android, sans avoir à importer groovy.io.FileType (NOTE: Les sous-répertoires ne sont pas recurse, mais lorsque j’ai trouvé cette solution, je ne me souciais plus de la récursivité, vous ne pouvez donc pas non plus):

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