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ę?

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
}

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


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
}

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.