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.