Dapatkan daftar semua file dalam direktori (rekursif)


95

Saya mencoba untuk mendapatkan (bukan mencetak, itu mudah) daftar file di direktori dan sub direktorinya.

Saya sudah mencoba:

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

Saya hanya mendapatkan direktori. Saya juga sudah mencoba:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Tapi "file" tidak dikenali dalam lingkup penutupan.

Bagaimana cara mendapatkan daftarnya?

Jawaban:


215

Kode ini berfungsi untuk saya:

import groovy.io.FileType

def list = []

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

Setelah itu variabel daftar berisi semua file (java.io.File) dari direktori yang diberikan dan subdirektorinya:

list.each {
  println it.path
}

15
Secara default, groovy mengimpor java.io tetapi bukan groovy.io, jadi untuk menggunakan FileType Anda harus mengimpornya secara eksplisit.
Chris Mountford

4
Untuk menggunakan FileType, pastikan Anda menggunakan versi groovy yang benar: "kelas groovy.io.FileType telah diperkenalkan di Groovy versi 1.7.1." lihat: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach

Ini menampilkan nama folder bersama dengan jalurnya. Misalnya: /tmp/directory1Cara mendapatkan directory1output sendiri
soundararajan.c

aneh..ini memberikan jalur root bahkan jika saya ././path
mengawalnya

Bagaimana cara membuat daftar semua folder di direktori?
Carlos Andres


6

Yang berikut ini berfungsi untuk saya di Gradle / Groovy untuk build.gradleproyek Android, tanpa harus mengimpor groovy.io.FileType(CATATAN: Subdirektori tidak berulang, tetapi ketika saya menemukan solusi ini, saya tidak lagi peduli tentang rekursi, jadi Anda juga tidak boleh):

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

1
meskipun ini mungkin tidak berulang melalui subdirektori. Namun: bekerja untuk tujuan saya untuk memisahkan file proguard dan mengimpor semuanya sekaligus :)
ChrisPrime

Sayangnya ini tidak menjawab pertanyaan "semua file dalam direktori (rekursif)". Ini hanya akan mencantumkan direktori saat ini dan menyesatkan dalam konteksnya.
ottago

fileTreeberulang.
Noel Yap

FileTreetidak termasuk direktori (tidak memperlakukannya sebagai file).
DNax

1

Inilah yang saya temukan untuk skrip build 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
    }
}

Menggunakan daftar diambil dari IDEA di atas. Masalah dengan skrip di atas adalah mereka perlu mengimpor groovy.io.FileType.FILES. skrip gradle tidak suka itu. Jadi saya hanya membuat metode untuk mencari file yang memanggil dirinya sendiri saat direktori ditemukan.
Timothy Strunk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.