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


92

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

我试过了:

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

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

如何获得清单?

Answers:


212

该代码对我有用:

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
}

15
缺省情况下,groovy导入java.io而不是groovy.io,因此要使用FileType,必须显式导入。
克里斯·芒特福德

4
为了使用FileType,请确保使用正确的groovy版本:“ Groovy 1.7.1版引入了groovy.io.FileType类。” 见:stackoverflow.com/questions/6317373/...
Tidhar克莱恩奥尔巴赫

这将显示文件夹名称及其路径。例如:/tmp/directory1如何directory1在输出中获得孤独

怪异..即使我给它加了././path
前缀,

如何列出目录中的所有文件夹?
卡洛斯·安德列斯


6

以下内容适用于build.gradleAndroid项目的Gradle / Groovy中的我,而无需导入groovy.io.FileType(注意:不递归子目录,但是当我找到此解决方案时,我不再关心递归,因此您可能也不愿意):

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

1
尽管这可能不会通过子目录递归。但是:出于我的目的而工作,以分离出proguard文件并一次将其全部导入:)
ChrisPrime '16

不幸的是,这不能回答“目录中的所有文件(递归)”的问题。它只会列出当前目录,并且会在上下文中产生误导。
ottago

fileTree递归。
Noel Yap

FileTree不包括目录(不将其视为文件)。
DNax '17

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脚本不喜欢这样。因此,我只是提出了一种方法,用于在找到目录时查找会自动调用的文件。
Timothy Strunk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.