Obtenha uma lista de todos os arquivos em um diretório (recursivo)

92

Estou tentando obter (não imprimir, isso é fácil) a lista de arquivos em um diretório e seus subdiretórios.

Eu tentei:

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

Eu só recebo os diretórios. Eu também tentei:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Mas "arquivos" não são reconhecidos no âmbito do fechamento.

Como faço para obter a lista?

Yossale
fonte

Respostas:

212

Este código funciona para mim:

import groovy.io.FileType

def list = []

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

Posteriormente, a variável de lista contém todos os arquivos (java.io.File) do diretório fornecido e seus subdiretórios:

list.each {
  println it.path
}
Christoph Metzendorf
fonte
15
Por padrão, groovy importa java.io, mas não groovy.io, portanto, para usar o FileType, você deve importá-lo explicitamente.
Chris Mountford
4
Para usar o FileType, certifique-se de usar a versão groovy correta: "a classe groovy.io.FileType foi introduzida na versão Groovy 1.7.1." consulte: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach
Isso estava exibindo os nomes das pastas junto com seu caminho. Por exemplo: /tmp/directory1Como obter o directory1sozinho na saída
soundararajan.c
estranho ... isso dá o caminho da raiz, mesmo se eu ././path
prefaciá-
Como posso listar todas as pastas no diretório?
Carlos Andres
16

As versões mais recentes do Groovy (1.7.2+) oferecem uma extensão JDK para percorrer mais facilmente os arquivos em um diretório, por exemplo:

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

Veja também [1] para mais exemplos.

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

Oscar Scholten
fonte
6

O seguinte funciona para mim no Gradle / Groovy para build.gradleum projeto Android, sem ter que importar groovy.io.FileType(NOTA: Não recursiva subdiretórios, mas quando encontrei esta solução, não me importei mais com a recursão, então você também não pode):

FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
    println "Proguard file located and processed: " + it
}
ChrisPrime
fonte
1
embora isso provavelmente não recorra aos subdiretórios. No entanto: funcionou para os meus propósitos de separar os arquivos proguard e importá-los todos de uma vez :)
ChrisPrime
Infelizmente, isso não responde à pergunta "todos os arquivos em um diretório (recursivo)". Ele listará apenas o diretório atual e é enganoso no contexto.
ottago
fileTreerecursiva.
Noel Yap
FileTreenão inclui diretórios (não os trata como arquivos).
DNax
1

Isso é o que eu criei para um script de compilação do 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
fonte
O uso da lista foi retirado da IDEA acima. O problema com os scripts acima é que eles exigem a importação de groovy.io.FileType.FILES. os scripts do Gradle não gostam disso. Então, acabei de criar um método para procurar os arquivos que chama a si mesmo quando um diretório é encontrado.
Timothy Strunk