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?

Yossale
sumber

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
}
Christoph Metzendorf
sumber
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
18

Versi yang lebih baru dari Groovy (1.7.2+) menawarkan ekstensi JDK agar lebih mudah menelusuri file dalam direktori, misalnya:

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

Lihat juga [1] untuk contoh lainnya.

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

Oscar Scholten
sumber
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
}
ChrisPrime
sumber
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
    }
}
Timothy Strunk
sumber
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