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

Posted

技术标签:

【中文标题】获取目录中所有文件的列表(递归)【英文标题】:Get a list of all the files in a directory (recursive) 【发布时间】:2011-04-26 14:53:49 【问题描述】:

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

我试过了:

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

但是“文件”在闭包的范围内是不被识别的。

如何获取列表?

【问题讨论】:

【参考方案1】:

这是我想出的 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 脚本不喜欢这样。所以我只是做了一个方法来查找找到目录时调用自己的文件。【参考方案2】:

以下适用于我在 Gradle / Groovy for build.gradleandroid 项目,而无需导入 groovy.io.FileType(注意:不递归子目录,但是当我找到这个解决方案时,我不再关心递归,所以你也不能):

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

【讨论】:

虽然这可能不会通过子目录递归。但是:为了我的目的,分离出 proguard 文件并一次性导入它们:) 不幸的是,这并没有回答“目录中的所有文件(递归)”的问题。它只会列出当前目录,并且在上下文中具有误导性。 fileTree 递归。 FileTree 不包括目录(不将它们视为文件)。【参考方案3】:

较新版本的 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

【讨论】:

【参考方案4】:

此代码适用于我:

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 会导入 java.io 而不是 groovy.io,因此要使用 FileType,您必须显式导入它。 对于使用 FileType,请确保使用正确的 groovy 版本:“类 groovy.io.FileType 是在 Groovy 版本 1.7.1 中引入的。”见:***.com/questions/6317373/… 这是显示文件夹名称及其路径。例如:/tmp/directory1 如何在输出中单独获取directory1 奇怪..这给出了根路径,即使我用.开头它也是/./path 如何列出目录中的所有文件夹?

以上是关于获取目录中所有文件的列表(递归)的主要内容,如果未能解决你的问题,请参考以下文章

Golang 递归获取目录下所有文件

获取递归包含在目录中的文件列表的最快方法是啥?

异步和递归目录扫描,用于 Nodejs 和 Expressjs 中的文件列表

[javaSE] IO流(FIle对象递归文件列表)

使用承诺和递归迭代文件目录

Java非递归的方式获取目录中所有文件(包括目录)