Ottieni un elenco di tutti i file in una directory (ricorsivo)


92

Sto cercando di ottenere (non stampare, è facile) l'elenco dei file in una directory e le sue sottodirectory.

Ho provato:

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

Ottengo solo le directory. Ho anche provato:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Ma "file" non è riconosciuto nell'ambito della chiusura.

Come ottengo l'elenco?

Risposte:


212

Questo codice funziona per me:

import groovy.io.FileType

def list = []

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

Successivamente la variabile list contiene tutti i file (java.io.File) della directory data e delle sue sottodirectory:

list.each {
  println it.path
}

15
Per impostazione predefinita, groovy importa java.io ma non groovy.io, quindi per utilizzare FileType devi averlo importato esplicitamente.
Chris Mountford,

4
Per utilizzare FileType, assicurati di utilizzare la versione groovy corretta: "la classe groovy.io.FileType è stata introdotta nella versione 1.7.1 di Groovy." vedi: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach,

Questo mostrava i nomi delle cartelle insieme al suo percorso. Ad esempio: /tmp/directory1come ottenere il directory1solo nell'output
soundararajan.c

strano..questo fornisce il percorso della radice anche se lo ././path
premetto

Come posso elencare tutte le cartelle nella directory?
Carlos Andres


6

Quanto segue funziona per me in Gradle / Groovy per build.gradleun progetto Android, senza dover importare groovy.io.FileType(NOTA: non ricorre le sottodirectory, ma quando ho trovato questa soluzione non mi importava più della ricorsione, quindi non puoi neanche):

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

1
anche se questo probabilmente non ricorre attraverso le sottodirectory. Tuttavia: ha funzionato per i miei scopi per separare i file proguard e importarli tutti in una volta :)
ChrisPrime

Purtroppo questo non risponde alla domanda "tutti i file in una directory (ricorsivi)". Elencherà solo la directory corrente ed è fuorviante nel contesto.
ottago

fileTreericorse.
Noel Yap

FileTreenon include le directory (non trattandole come file).
DNax

1

Questo è ciò che mi è venuto in mente per uno script di 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
    }
}

L'uso dell'elenco è stato preso dall'IDEA sopra. Il problema con gli script precedenti è che richiedono l'importazione di groovy.io.FileType.FILES. agli script gradle non piace. Quindi ho appena creato un metodo per cercare i file che si chiama quando viene trovata una directory.
Timothy Strunk il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.