2010-10-17 2 views
75

Я пытаюсь получить (не распечатать, это просто) список файлов в каталоге и его подкаталогах.Получить список всех файлов в каталоге (рекурсивный)

Я пробовал:

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

, но «файлы» не признаются в объеме крышки.

Как мне получить список?

ответ

150

Этот код работает для меня:

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 
} 
+11

По умолчанию заводной импорта java.io, но не groovy.io так, чтобы использовать FileType вы должны явно импортировать. –

+2

Для использования FileType убедитесь, что вы используете правильную версию groovy: «класс groovy.io.FileType был введен в Groovy версии 1.7.1». см. http://stackoverflow.com/questions/6317373/unable-to-resolve-class-groovy-io-filetype-error –

+0

Это отображает имена папок вместе со своим путем. Например: '/ tmp/directory1' Как получить' directory1' самостоятельно на выходе –

5

В случае, если это помогает кто-нибудь еще, для меня работает в Gradle/Groovy для build.gradle для Android-проекта без импорта groovy.io.FileType (ПРИМЕЧАНИЕ: не рекурсирует подкаталоги, но когда я нашел это решение, я больше не заботился о рекурсии, так что вы не можете это сделать):

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

, хотя это, вероятно, не рекурсивно проходит через подкаталоги. Однако: работал для моих целей для разделения файлов proguard и импорта их сразу :) – ChrisPrime

+0

К сожалению, это не отвечает на вопрос «все файлы в каталоге (рекурсивный)». Он будет перечислять только текущий каталог и вводит в заблуждение в контексте. – ottago

+0

'fileTree' recurses. –

7

Новые версии 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

Смежные вопросы