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?

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
}

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


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
}

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.