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

108

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

我尝试过:

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);

但是“files”在闭包的范围内未被识别。

我该如何获取列表?

5个回答

246

这段代码对我来说可行:

import groovy.io.FileType

def list = []

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

接下来,list变量包含给定目录及其子目录中的所有文件(java.io.File):

list.each {
  println it.path
}

17
默认情况下,Groovy 会导入 java.io 包,但不会导入 groovy.io 包,因此如果要使用 FileType 类,必须显式地导入它。 - Chris Mountford
4
使用FileType时,请确保使用正确的Groovy版本:"groovy.io.FileType类是在Groovy版本1.7.1中引入的." 参见:http://stackoverflow.com/questions/6317373/unable-to-resolve-class-groovy-io-filetype-error。 - Tidhar Klein Orbach
这个程序会显示文件夹名称以及它的路径。 例如:/tmp/directory1 如何在输出中只得到 directory1 - soundararajan.c
我该如何列出目录中的所有文件夹? - Carlos Andres
1
在Jenkins Groovy中没有File类型。 - Verthais
显示剩余4条评论

29

6
在Android项目的build.gradle文件中,以下代码可用于Gradle/Groovy。无需导入groovy.io.FileType(注意:不会递归子目录,但当我找到这个解决方案时,我不再关心递归,也许你也不需要):
FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
    println "Proguard file located and processed: " + it
}

1
虽然这可能不会递归遍历子目录。但是:对于我分离混淆文件并一次性导入它们的目的而言,它起到了作用 :) - ChrisPrime
不幸的是,这并没有回答“一个目录中的所有文件(递归)”的问题。它只会列出当前目录,并且在这种情况下具有误导性。 - ottago
fileTree 递归。 - Noel Yap
FileTree 不包括目录(不将其视为文件)。 - DNax

3
这是我为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
    }
}

使用上面的IDEA中提取了列表。 以上脚本的问题在于它们需要导入groovy.io.FileType.FILES。gradle脚本不喜欢那样做。 因此,我只是编写了一个查找文件的方法,当发现目录时调用自身。 - Timothy Strunk

2
使用Kotlin Gradle脚本可以这样做:
// ...
val yamls = layout.files({
    file("src/main/resources/mixcr_presets").walk()
        .filter { it.extension == "yaml" }
        .toList()
})
// ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接