web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルのリストを取得します(再帰的)

ディレクトリとそのサブディレクトリ内のファイルのリストを取得しようとしています(印刷ではなく、簡単です)。

私はもう試した:

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

しかし、「ファイル」は閉鎖の範囲では認識されません。

リストを取得するにはどうすればよいですか?

87
Yossale

このコードは私のために機能します:

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
}
198

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

12
Oscar Scholten

次はGradle/GroovyでAndroidプロジェクトのbuild.gradleで動作し、groovy.io.FileTypeをインポートする必要はありません(注:サブディレクトリを再帰しませんが、このソリューションを見つけたときは再帰を気にしなくなったので、次のいずれでもないかもしれません):

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