2010-10-17 1 views
75

Tôi đang cố gắng lấy (không in, thật dễ dàng) danh sách tệp trong thư mục và thư mục con của nó.Lấy danh sách tất cả các tệp trong thư mục (đệ quy)

Tôi đã thử:

def folder = "C:\\DevEnv\\Projects\\Generic"; 
def baseDir = new File(folder); 
files = baseDir.listFiles(); 

tôi chỉ nhận được dirs. Tôi cũng đã thử

def files = [];  

def processFileClosure = { 
     println "working on ${it.canonicalPath}: " 
     files.add (it.canonicalPath);     
    } 

baseDir.eachFileRecurse(FileType.FILES, processFileClosure); 

nhưng "tệp" không được công nhận trong phạm vi đóng.

Làm cách nào để có danh sách?

Trả lời

150

Mã này làm việc cho tôi:

import groovy.io.FileType 

def list = [] 

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

Sau đó biến danh sách chứa tất cả các file (java.io.File) của thư mục nhất định và các thư mục con của nó:

list.each { 
    println it.path 
} 
+11

Theo mặc định, nhập khẩu groovy java.io nhưng không groovy.io vậy để sử dụng Kiểu Tệp bạn phải có một cách rõ ràng import nó. –

+2

Để sử dụng FileType, hãy đảm bảo bạn sử dụng phiên bản groovy phù hợp: "class groovy.io.FileType được giới thiệu trong phiên bản Groovy 1.7.1." xem: http://stackoverflow.com/questions/6317373/unable-to-resolve-class-groovy-io-filetype-error –

+0

Điều này đã hiển thị tên thư mục cùng với đường dẫn của nó. Ví dụ: '/ tmp/directory1' Cách lấy' thư mục1' một mình trong đầu ra –

5

Trong trường hợp này giúp bất kỳ ai khác, sau đây làm việc cho tôi trong Gradle/Groovy cho build.gradle cho một dự án Android, mà không phải nhập groovy.io.FileType (LƯU Ý: Không recurse thư mục con nhưng khi tôi tìm thấy giải pháp này tôi không còn quan tâm đến đệ quy, vì vậy bạn có thể không phải là:)

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

mặc dù điều này có thể không recurse thông qua các thư mục con. Tuy nhiên: làm việc cho mục đích của tôi để tách ra các tập tin proguard và nhập tất cả cùng một lúc :) – ChrisPrime

+0

Thật không may điều này không trả lời câu hỏi "tất cả các tập tin trong một thư mục (đệ quy)". Nó sẽ chỉ liệt kê thư mục hiện tại và gây hiểu lầm trong ngữ cảnh. – ottago

+0

'fileTree' đệ quy. –

7

các phiên bản mới hơn của Groovy (1.7.2+) cung cấp một phần mở rộng JDK để dễ dàng hơn đi qua qua các tập tin trong một thư mục, ví dụ:

import static groovy.io.FileType.FILES 
def dir = new File("."); 
def files = []; 
dir.traverse(type: FILES, maxDepth: 0) { files.add(it) }; 

Xem thêm [1] để biết thêm ví dụ.

[1] http://mrhaki.blogspot.nl/2010/04/groovy-goodness-traversing-directory.html