我正在尝试获取(不是打印,这很容易)目录及其子目录中的文件列表。
我已经尝试过:
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);
但是“文件”在闭包范围内不被识别。
如何获取列表?
此代码对我有用:
import groovy.io.FileType
def list = []
def dir = new File("path_to_parent_dir")
dir.eachFileRecurse (FileType.FILES) { file ->
list << file
}
之后列表变量包含给定目录及其子目录的所有文件(java.io.File):
list.each {
println it.path
}
较新版本的 Groovy (1.7.2+) 提供了 JDK 扩展,可以更轻松地遍历目录中的文件,例如:
import static groovy.io.FileType.FILES
def dir = new File(".");
def files = [];
dir.traverse(type: FILES, maxDepth: 0) { files.add(it) };
另请参阅 [1] 了解更多示例。
[1] http://mrhaki.blogspot.nl/2010/04/groovy-goodness-traversing-directory.html
以下内容适用于 Android 项目的 Gradle / Groovy for
build.gradle
,而无需导入 groovy.io.FileType
(注意:不会递归子目录,但是当我找到这个解决方案时,我不再关心递归,所以你可以也不是):
FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
println "Proguard file located and processed: " + it
}
这就是我为 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
}
}
使用 Kotlin Gradle 脚本,可以这样做:
// ...
val yamls = layout.files({
file("src/main/resources/mixcr_presets").walk()
.filter { it.extension == "yaml" }
.toList()
})
// ...
在 Groovy 的较新版本中,您可以简单地将文件收集到列表中:
def list = [].tap({ files -> new File(".").eachFileRecurse(FileType.FILES, { files << it }) })
使用
traverse(..)
而不是 eachFileRecurse(..)
仅过滤特定文件:
def list = [].tap({ files -> new File(".").traverse([nameFilter: ~/.*\.groovy$/], { files << it }) })