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

93

J'essaye d'obtenir (pas d'imprimer, c'est facile) la liste des fichiers dans un répertoire et 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 répertoires. J'ai aussi essayé:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Mais les "fichiers" ne sont pas reconnus dans le cadre de la fermeture.

Comment obtenir la liste?

Yossale
la source

Réponses:

213

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 de ses sous-répertoires:

list.each {
  println it.path
}
Christoph Metzendorf
la source
15
Par défaut, groovy importe java.io mais pas groovy.io donc pour utiliser FileType, vous devez l'avoir importé explicitement.
Chris Mountford
4
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: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach
Cela affichait les noms de dossier avec son chemin. Par exemple: /tmp/directory1Comment obtenir le directory1seul dans la sortie
soundararajan.c
bizarre .. cela donne le chemin racine même si je le préface avec un .It /./path
Go
Comment puis-je lister tous les dossiers du répertoire?
Carlos Andres
18

Les versions 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

Oscar Scholten
la source
6

Ce qui suit fonctionne pour moi dans Gradle / Groovy pour build.gradleun projet Android, sans avoir à importer groovy.io.FileType(NOTE: ne récurent pas les sous-répertoires, mais quand j'ai trouvé cette solution, je ne me souciais plus de 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
}
ChrisPrime
la source
1
bien que cela ne se répète probablement pas dans les sous-répertoires. Cependant: a fonctionné pour mes besoins pour séparer les fichiers proguard et les importer tous à la fois :)
ChrisPrime
Malheureusement cela ne répond pas à la question "tous les fichiers dans un répertoire (récursif)". Il ne listera que le répertoire actuel et est trompeur dans le contexte.
ottago le
fileTreese répète.
Noel Yap
FileTreen'inclut pas les répertoires (ne les traitant pas comme des fichiers).
DNax
1

Voici ce que j'ai proposé pour un script de construction 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
la source
L'utilisation de la liste a été tirée de l'IDEA ci-dessus. Le problème avec les scripts ci-dessus est qu'ils doivent importer groovy.io.FileType.FILES. les scripts gradle n'aiment pas ça. J'ai donc juste fait une méthode pour rechercher les fichiers qui s'appellent quand un répertoire est trouvé.
Timothy Strunk