Bir dizindeki tüm dosyaların listesini alın (özyinelemeli)


95

Bir dizindeki ve alt dizinlerindeki dosyaların listesini (yazdırmak değil, bu kolay) almaya çalışıyorum.

Denedim:

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

Ben sadece dizinleri alıyorum. Ben de denedim:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Ancak kapatma kapsamında "dosyalar" tanınmıyor.

Listeyi nasıl alırım?

Yanıtlar:


215

Bu kod benim için çalışıyor:

import groovy.io.FileType

def list = []

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

Daha sonra liste değişkeni, verilen dizinin ve alt dizinlerinin tüm dosyalarını (java.io.File) içerir:

list.each {
  println it.path
}

15
Varsayılan olarak, groovy java.io'yu içe aktarır ancak groovy.io'yu içe aktarmaz, bu nedenle FileType'ı kullanmak için açıkça içe aktarmış olmanız gerekir.
Chris Mountford

4
FileType'ı kullanmak için doğru harika sürümü kullandığınızdan emin olun: "groovy.io.FileType sınıfı Groovy 1.7.1 sürümünde tanıtıldı." bkz: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach

Bu, klasör adlarını yolunun yanında görüntülüyordu. Örneğin: Çıktıda yalnız /tmp/directory1nasıl olunurdirectory1
soundararajan.c

tuhaf..bu, bir .It /./path
go ile başlasam

Dizindeki tüm klasörleri nasıl listeleyebilirim?
Carlos Andres


6

Aşağıdakiler build.gradle, bir Android projesi için Gradle / Groovy'de içe aktarmaya gerek kalmadan benim için çalışıyor groovy.io.FileType(NOT: Alt dizinleri yinelemiyor , ancak bu çözümü bulduğumda artık özyinelemeye aldırış etmedim, bu yüzden ikisini de yapmayabilirsiniz):

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

1
bu muhtemelen alt dizinler aracılığıyla tekrarlanmasa da. Ancak: proguard dosyalarını ayırma ve hepsini bir kerede içe aktarma amaçlarım için çalıştı :)
ChrisPrime

Ne yazık ki bu, "bir dizindeki tüm dosyalar (özyinelemeli)" sorusunu yanıtlamaz. Yalnızca geçerli dizini listeler ve bağlamda yanıltıcıdır.
ottago

fileTreeyinelenir.
Noel Yap

FileTreedizinleri içermez (bunları dosya olarak işlemez).
DNax

1

Gradle oluşturma komut dosyası için bulduğum şey bu:

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

Listeyi kullanmak yukarıdaki IDEA'dan alınmıştır. Yukarıdaki komut dosyalarıyla ilgili sorun, groovy.io.FileType.FILES dosyasını içe aktarmanın gerekmesidir. gradle betikleri bundan hoşlanmaz. Bu yüzden, bir dizin bulunduğunda kendisini çağıran dosyaları aramak için bir yöntem yaptım.
Timothy Strunk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.