Отримати список усіх файлів у каталозі (рекурсивно)


93

Я намагаюся отримати (не надрукувати, це просто) список файлів у каталозі та його підкаталогах.

Я пробував:

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);

Але "файли" не розпізнаються в рамках закриття.

Як отримати список?

Відповіді:


213

Цей код працює для мене:

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 / ...
Tidhar Klein Орбах

Це відображало імена папок разом із їхнім шляхом. Напр .: /tmp/directory1Як отримати directory1одного на виході
soundararajan.c

дивно .. це дає кореневий шлях, навіть якщо я передмовляю його до .It it/./path
light24bulbs

Як я можу перерахувати всі папки в каталозі?
Карлос Андрес,

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

На жаль, це не відповідає на питання "всі файли в каталозі (рекурсивно)". У ньому буде лише перелік поточного каталогу і вводить в оману в контексті.
оттаго,

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.