Nhận danh sách tất cả các tệp trong một thư mục (đệ quy)


93

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

Tôi đã thử:

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

Tôi chỉ nhận được các thư mục. 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 nhận dạng trong phạm vi của việc đóng.

Làm cách nào để lấy danh sách?

Câu trả lời:


213

Mã này phù hợp với 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 tệp (java.io.File) của thư mục đã cho và các thư mục con của nó:

list.each {
  println it.path
}

15
Theo mặc định, groovy nhập java.io nhưng không nhập groovy.io, vì vậy để sử dụng FileType, bạn phải nhập rõ ràng nó.
Chris Mountford

4
Để sử dụng FileType, hãy đảm bảo bạn sử dụng đúng phiên bản Groovy: "class groovy.io.FileType đã được giới thiệu trong Groovy phiên bản 1.7.1." xem: stackoverflow.com/questions/6317373/...
Tidhar Klein Orbach

Điều này đang hiển thị tên thư mục cùng với đường dẫn của nó. Ví dụ: /tmp/directory1Làm thế nào để có được directory1một mình trong đầu ra
soundararajan.c Ngày

weird..this cung cấp cho các đường dẫn gốc ngay cả khi tôi mở đầu bằng một .Nó đi/./path
light24bulbs

Làm cách nào để liệt kê tất cả các thư mục trên thư mục?
Carlos Andres


6

Cách sau phù hợp với tôi trong Gradle / Groovy cho build.gradlemột dự án Android mà không cần phải nhập groovy.io.FileType(LƯU Ý: Không đệ quy các 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 nữa, vì vậy bạn có thể không):

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 lặp lại 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 file Proguard và nhập khẩu tất cả chúng cùng một lúc :)
ChrisPrime

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

fileTreelặp lại.
Noel Yap

FileTreekhông bao gồm các thư mục (không coi chúng là tệp).
DNax

1

Đây là những gì tôi nghĩ ra cho một kịch bản xây dựng 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
    }
}

Sử dụng danh sách được lấy từ IDEA ở trên. Vấn đề với các tập lệnh trên là chúng yêu cầu nhập groovy.io.FileType.FILES. tập lệnh gradle không thích điều đó. Vì vậy, tôi chỉ thực hiện một phương pháp để tìm kiếm các tệp tự gọi khi tìm thấy một thư mục.
Timothy Strunk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.