Получить список всех файлов в каталоге (рекурсивно)


95

Я пытаюсь получить (не распечатать, это просто) список файлов в каталоге и его подкаталогах.

Я пытался:

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

Я получаю только каталоги. Я также пробовал:

def files = [];

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

baseDir.eachFileRecurse(FileType.FILES, processFileClosure);

Но «файлы» не распознаются в рамках закрытия.

Как мне получить список?

Ответы:


215

У меня работает этот код:

import groovy.io.FileType

def list = []

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

После этого переменная списка содержит все файлы (java.io.File) данного каталога и его подкаталогов:

list.each {
  println it.path
}

15
По умолчанию groovy импортирует java.io, но не groovy.io, поэтому для использования FileType вы должны явно импортировать его.
Крис Маунтфорд

4
Для использования FileType убедитесь, что вы используете правильную версию groovy: «класс groovy.io.FileType был представлен в Groovy версии 1.7.1». см .: stackoverflow.com/questions/6317373/…
Тидхар Кляйн Орбах

Это отображало имена папок вместе с их путем. Например: /tmp/directory1Как сделать так, чтобы на directory1выходе было только одно
soundararajan.c

странно .. это дает корневой путь, даже если я ././path
предваряю его словом «

Как я могу перечислить все папки в каталоге?
Карлос Андрес

18

Более новые версии Groovy (1.7.2+) предлагают расширение JDK для более удобного просмотра файлов в каталоге, например:

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

См. Также [1] для получения дополнительных примеров.

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


6

Следующее работает для меня в Gradle / Groovy build.gradleдля проекта Android без необходимости импорта groovy.io.FileType(ПРИМЕЧАНИЕ: не рекурсивно подкаталоги, но когда я нашел это решение, я больше не заботился о рекурсии, поэтому вы тоже можете не беспокоиться):

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

1
хотя это, вероятно, не проходит через подкаталоги. Однако: сработал для моих целей для разделения файлов proguard и импорта их всех сразу :)
ChrisPrime

К сожалению, это не отвечает на вопрос «все файлы в каталоге (рекурсивные)». Он будет отображать только текущий каталог и вводит в заблуждение в контексте.
ottago

fileTreeрекурсии.
Ноэль Яп

FileTreeне включает каталоги (не обрабатывает их как файлы).
DNax

1

Вот что я придумал для скрипта сборки 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
    }
}

Использование списка было взято из IDEA выше. Проблема с приведенными выше сценариями заключается в том, что они требуют импорта groovy.io.FileType.FILES. скриптам Gradle это не нравится. Поэтому я просто создал метод для поиска файлов, который вызывает сам себя при нахождении каталога.
Тимоти Странк,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.