รับรายการไฟล์ทั้งหมดในไดเร็กทอรี (เรียกซ้ำ)


95

ฉันกำลังพยายามหารายการไฟล์ในไดเร็กทอรีและไดเร็กทอรีย่อย

ฉันได้ลองแล้ว:

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

แต่ไม่รู้จัก "ไฟล์" ในขอบเขตของการปิด

ฉันจะรับรายชื่อได้อย่างไร

คำตอบ:


215

รหัสนี้ใช้ได้กับฉัน:

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
}

15
ตามค่าเริ่มต้น groovy จะนำเข้า java.io แต่ไม่ใช่ groovy.io ดังนั้นในการใช้ FileType คุณต้องนำเข้าอย่างชัดเจน
Chris Mountford

4
สำหรับการใช้ FileType ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชัน groovy ที่ถูกต้อง: "คลาส groovy.io.FileType เปิดตัวใน Groovy เวอร์ชัน 1.7.1" ดู: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach

นี่เป็นการแสดงชื่อโฟลเดอร์พร้อมกับพา ธ เช่น: /tmp/directory1วิธีรับdirectory1คนเดียวในเอาต์พุต
soundararajan.c

แปลก .. นี่ให้เส้นทางรูทแม้ว่าฉันจะนำหน้าด้วย.มันไป/./path
light24bulbs

ฉันจะแสดงรายการโฟลเดอร์ทั้งหมดในไดเรกทอรีได้อย่างไร
Carlos Andres

18

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


6

สิ่งต่อไปนี้ใช้ได้กับฉันใน 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

น่าเสียดายที่สิ่งนี้ไม่สามารถตอบคำถาม "ไฟล์ทั้งหมดในไดเรกทอรี (เรียกซ้ำ)" จะแสดงเฉพาะไดเรกทอรีปัจจุบันและทำให้เข้าใจผิดในบริบท
ottago

fileTreeเรียกซ้ำ
Noel Yap

FileTreeไม่รวมไดเรกทอรี (ไม่ถือว่าเป็นไฟล์)
DNax

1

นี่คือสิ่งที่ฉันคิดขึ้นมาสำหรับสคริปต์การสร้าง 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
    }
}

การใช้รายชื่อนำมาจาก IDEA ด้านบน ปัญหาเกี่ยวกับสคริปต์ข้างต้นคือต้องนำเข้า groovy.io.FileType.FILES สคริปต์ gradle ไม่เป็นเช่นนั้น ดังนั้นฉันจึงสร้างวิธีการค้นหาไฟล์ที่เรียกตัวเองเมื่อพบไดเร็กทอรี
Timothy Strunk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.