Holen Sie sich eine Liste aller Dateien in einem Verzeichnis (rekursiv)

92

Ich versuche, die Liste der Dateien in einem Verzeichnis und seinen Unterverzeichnissen abzurufen (nicht zu drucken, das ist einfach).

Ich habe es versucht:

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

Ich bekomme nur die Verzeichnisse. Ich habe auch versucht:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

"Dateien" werden jedoch im Rahmen des Abschlusses nicht erkannt.

Wie bekomme ich die Liste?

Yossale
quelle

Antworten:

212

Dieser Code funktioniert für mich:

import groovy.io.FileType

def list = []

def dir = new File("path_to_parent_dir")
dir.eachFileRecurse (FileType.FILES) { file ->
  list << file
}

Danach enthält die Listenvariable alle Dateien (java.io.File) des angegebenen Verzeichnisses und seiner Unterverzeichnisse:

list.each {
  println it.path
}
Christoph Metzendorf
quelle
15
Standardmäßig importiert groovy java.io, aber nicht groovy.io. Um FileType verwenden zu können, müssen Sie es explizit importieren.
Chris Mountford
4
Stellen Sie für die Verwendung von FileType sicher, dass Sie die richtige groovige Version verwenden: "Die Klasse groovy.io.FileType wurde in der groovigen Version 1.7.1 eingeführt." siehe: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach
Dies zeigte die Ordnernamen zusammen mit ihrem Pfad an. ZB: /tmp/directory1Wie man das directory1alleine in der Ausgabe
bekommt
seltsam..dies gibt den Wurzelpfad, auch wenn ich ihm ein .Es geht /./path
voran
Wie kann ich alle Ordner im Verzeichnis auflisten?
Carlos Andres
14

Neuere Versionen von Groovy (1.7.2+) bieten eine JDK-Erweiterung, mit der Dateien in einem Verzeichnis einfacher durchsucht werden können, zum Beispiel:

import static groovy.io.FileType.FILES
def dir = new File(".");
def files = [];
dir.traverse(type: FILES, maxDepth: 0) { files.add(it) };

Siehe auch [1] für weitere Beispiele.

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

Oscar Scholten
quelle
6

Das Folgende funktioniert für mich in Gradle / Groovy für build.gradleein Android-Projekt, ohne importiert werden zu müssen groovy.io.FileType(HINWEIS: Unterverzeichnisse werden nicht wiederholt, aber als ich diese Lösung gefunden habe, habe ich mich nicht mehr um die Rekursion gekümmert, sodass Sie dies möglicherweise auch nicht tun):

FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
    println "Proguard file located and processed: " + it
}
ChrisPrime
quelle
1
obwohl dies wahrscheinlich nicht durch Unterverzeichnisse wiederkehrt. Allerdings: arbeitete für meine Zwecke, um Proguard-Dateien zu trennen und alle auf einmal zu importieren :)
ChrisPrime
Leider beantwortet dies nicht die Frage "Alle Dateien in einem Verzeichnis (rekursiv)". Es wird nur das aktuelle Verzeichnis aufgelistet und ist im Kontext irreführend.
Ottawa
fileTreerekursiert.
Noel Yap
FileTreeenthält keine Verzeichnisse (behandelt sie nicht als Dateien).
DNax
1

Folgendes habe ich mir für ein Gradle-Build-Skript ausgedacht:

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
quelle
Die Verwendung der Liste wurde der obigen IDEE entnommen. Das Problem mit den oben genannten Skripten besteht darin, dass sie groovy.io.FileType.FILES importieren müssen. Gradle-Skripte mögen das nicht. Also habe ich gerade eine Methode erstellt, um nach den Dateien zu suchen, die sich selbst aufrufen, wenn ein Verzeichnis gefunden wird.
Timothy Strunk