Uzyskaj listę wszystkich plików w katalogu (rekurencyjne)

95

Próbuję uzyskać (nie drukować, to proste) listę plików w katalogu i jego podkatalogach.

Próbowałem:

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

Dostaję tylko katalogi. Próbowałem też:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Ale „pliki” nie są rozpoznawane w zakresie zamknięcia.

Jak uzyskać listę?

Yossale
źródło

Odpowiedzi:

215

Ten kod działa dla mnie:

import groovy.io.FileType

def list = []

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

Następnie zmienna list zawiera wszystkie pliki (java.io.File) z danego katalogu i jego podkatalogów:

list.each {
  println it.path
}
Christoph Metzendorf
źródło
15
Domyślnie groovy importuje java.io, ale nie groovy.io, więc aby użyć FileType, musisz go jawnie zaimportować.
Chris Mountford
4
Aby używać FileType, upewnij się, że używasz odpowiedniej wersji groovy: „klasa groovy.io.FileType została wprowadzona w Groovy w wersji 1.7.1”. patrz: stackoverflow.com/questions/6317373/…
Tidhar Klein Orbach
To było wyświetlanie nazw folderów wraz ze ścieżką. Np .: /tmp/directory1Jak zdobyć directory1samotność na wyjściu
soundararajan.c
dziwne ... to daje ścieżkę źródłową, nawet jeśli poprzedzę ją słowem .It /./path
going
Jak mogę wyświetlić listę wszystkich folderów w katalogu?
Carlos Andres
18

Nowsze wersje Groovy (1.7.2+) oferują rozszerzenie JDK, aby łatwiej przechodzić przez pliki w katalogu, na przykład:

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

Więcej przykładów można znaleźć w [1].

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

Oscar Scholten
źródło
6

Poniższe działa dla mnie w Gradle / Groovy dla build.gradleprojektu Android, bez konieczności importowania groovy.io.FileType(UWAGA: podkatalogi nie powtarzają się, ale kiedy znalazłem to rozwiązanie, nie przejmowałem się już rekurencją, więc możesz też nie):

FileCollection proGuardFileCollection = files { file('./proguard').listFiles() }
proGuardFileCollection.each {
    println "Proguard file located and processed: " + it
}
ChrisPrime
źródło
1
chociaż prawdopodobnie nie powtarza się to w podkatalogach. Jednak: pracował dla moich celów, oddzielając pliki proguard i importując je wszystkie naraz :)
ChrisPrime
Niestety nie daje to odpowiedzi na pytanie „wszystkie pliki w katalogu (rekurencyjne)”. Wyświetla tylko bieżący katalog i wprowadza w błąd w kontekście.
ottago
fileTreepowtarza się.
Noel Yap
FileTreenie obejmuje katalogów (nie traktuje ich jako plików).
DNax
1

Oto, co wymyśliłem dla skryptu kompilacji 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
źródło
Korzystanie z listy zostało zaczerpnięte z powyższego IDEA. Problem z powyższymi skryptami polega na tym, że wymagają one importowania groovy.io.FileType.FILES. Skrypty gradle tego nie lubią. Dlatego właśnie stworzyłem metodę wyszukiwania plików, które wywołują siebie po znalezieniu katalogu.
Timothy Strunk