2010-09-07 33 views
29

Tôi đang cố gắng đệ quy liệt kê tất cả các tệp phù hợp với một loại tệp cụ thể trong Groovy. This example gần như vậy. Tuy nhiên, nó không liệt kê các tập tin trong thư mục gốc. Có cách nào để sửa đổi này để liệt kê các tập tin trong thư mục gốc? Hoặc, có cách nào khác để làm điều đó không?Danh sách đệ quy của tất cả các tệp phù hợp với một loại tệp nhất định trong Groovy

Trả lời

69

này nên giải quyết vấn đề của bạn:

import static groovy.io.FileType.FILES 

new File('.').eachFileRecurse(FILES) { 
    if(it.name.endsWith('.groovy')) { 
     println it 
    } 
} 

eachFileRecurse mất một Kiểu Tệp enum mà xác định rằng bạn chỉ quan tâm trong các tập tin. Phần còn lại của vấn đề được giải quyết dễ dàng bằng cách lọc tên của tập tin. Có thể đáng nói đến là eachFileRecurse thường đệ quy trên cả hai tệp và thư mục trong khi eachDirRecurse chỉ tìm thấy thư mục.

3

thay thế eachDirRecurse bởi eachFileRecurse và nó sẽ hoạt động.

3
// Define closure 
def result 

findTxtFileClos = { 

     it.eachDir(findTxtFileClos); 
     it.eachFileMatch(~/.*.txt/) {file -> 
       result += "${file.absolutePath}\n" 
     } 
    } 

// Apply closure 
findTxtFileClos(new File(".")) 

println result 
+0

đoạn bạn sẽ tìm thấy cùng một tập tin nhiều lần. Để làm cho nó hoạt động, bạn sẽ phải sử dụng eachDirRecurse thay thế và cho mỗi dir sử dụng dir.eachFileMatch để tìm các tệp trong thư mục. Kiểm tra giải pháp của tôi cho một cách khác để giải quyết vấn đề. – xlson

+0

cách tiếp cận mới ... –

7

groovy phiên bản 2.4.7:

new File(pathToFolder).traverse(type: groovy.io.FileType.FILES) { it -> 
    println it 
} 

bạn cũng có thể thêm bộ lọc như

new File(parentPath).traverse(type: groovy.io.FileType.FILES, nameFilter: ~/patternRegex/) { it -> 
    println it 
} 
Các vấn đề liên quan