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?

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
}

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


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
}

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.