获取目录中所有文件的列表(递归)

我试图获取(不是打印,这很容易)目录及其子目录中的文件列表。

我试过了:

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

我只有目录,我也试过:

def files = [];


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


baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

但是“文件”在闭包的作用域中无法识别。

我怎么才能拿到名单?

231266 次浏览

This code works for me:

import groovy.io.FileType


def list = []


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

Afterwards the list variable contains all files (java.io.File) of the given directory and its subdirectories:

list.each {
println it.path
}

The following works for me in Gradle / Groovy for build.gradle for an Android project, without having to import groovy.io.FileType (NOTE: Does not recurse subdirectories, but when I found this solution I no longer cared about recursion, so you may not either):

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

Newer versions of Groovy (1.7.2+) offer a JDK extension to more easily traverse over files in a directory, for example:

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

See also [1] for more examples.

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

This is what I came up with for a gradle build 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
}
}

With Kotlin Gradle script one can do it like this:

// ...
val yamls = layout.files({
file("src/main/resources/mixcr_presets").walk()
.filter { it.extension == "yaml" }
.toList()
})
// ...