108 votes

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

J'essaie d'obtenir (pas d'imprimer, 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 n'obtiens 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 "dossiers" ne sont pas reconnus dans le cadre de la fermeture.

Comment obtenir la liste ?

245voto

Christoph Metzendorf Points 4205

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 list contient tous les fichiers (java.io.File) du répertoire donné et de ses sous-répertoires :

list.each {
  println it.path
}

17 votes

Par défaut, groovy importe java.io mais pas groovy.io donc pour utiliser FileType vous devez l'importer explicitement.

4 votes

Pour l'utilisation de FileType, assurez-vous d'utiliser la bonne version de groovy : "la classe groovy.io.FileType a été introduite dans Groovy version 1.7.1." voir : stackoverflow.com/questions/6317373/

0 votes

Cela affichait les noms de dossiers avec leur chemin d'accès. Par exemple : /tmp/directory1 Comment obtenir le directory1 seul dans la sortie

29voto

Oscar Scholten Points 510

Les versions plus récentes de Groovy (1.7.2+) offrent une extension JDK permettant de 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 également [1] pour d'autres exemples.

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

6voto

ChrisPrime Points 431

Ce qui suit fonctionne pour moi dans Gradle / Groovy pour build.gradle pour un projet Android, sans avoir à importer groovy.io.FileType (NOTE : Ne récure pas les sous-répertoires, mais lorsque j'ai trouvé cette solution, je ne me suis plus soucié de la récursion, donc vous ne le ferez peut-être pas non plus) :

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

1 votes

Bien que cela ne récure probablement pas dans les sous-répertoires. Cependant : cela a fonctionné pour mes besoins de séparer les fichiers proguard et de les importer tous en même temps :)

0 votes

Malheureusement, cela ne répond pas à la question "tous les fichiers d'un répertoire (récursif)". Elle ne listera que le répertoire actuel et est trompeuse dans le contexte.

0 votes

fileTree récurrences.

3voto

Timothy Strunk Points 11

Voici ce que j'ai trouvé pour une construction gradle script :

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

0 votes

L'utilisation de la liste est tirée de l'IDEA ci-dessus. Le problème avec les scripts ci-dessus est qu'ils nécessitent d'importer groovy.io.FileType.FILES. Les scripts de gradle n'aiment pas ça. Donc j'ai juste fait une méthode pour chercher les fichiers qui s'appelle elle-même quand un répertoire est trouvé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X