निर्देशिका में सभी फ़ाइलों की सूची प्राप्त करें (पुनरावर्ती)


92

मैं एक निर्देशिका और इसके उप निर्देशिकाओं में फ़ाइलों की सूची प्राप्त करने (प्रिंट न करने, यह आसान है) प्राप्त करने की कोशिश कर रहा हूं।

मैंने कोशिश की:

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

लेकिन "फाइलें" बंद होने के दायरे में मान्यता प्राप्त नहीं है।

मुझे सूची कैसे मिलेगी?

जवाबों:


212

यह कोड मेरे लिए काम करता है:

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 Orbach

यह अपने पथ के साथ फ़ोल्डर नामों को प्रदर्शित कर रहा था। उदा: आउटपुट में अकेले /tmp/directory1कैसे प्राप्त करेंdirectory1
soundararajan.c

weird..this रूट पथ देता है, भले ही मैं एक साथ यह प्रस्तावना .यह हो जाता है/./path
light24bulbs

मैं निर्देशिका पर सभी फ़ोल्डरों को कैसे सूचीबद्ध कर सकता हूं?
कार्लोस एंड्रेस

16

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] भी देखें।

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


6

निम्नलिखित में build.gradleएक एंड्रॉइड प्रोजेक्ट के लिए ग्रैडल / ग्रूवी में मेरे लिए काम करता है , आयात किए बिना groovy.io.FileType(नोट: उपनिर्देशिका की पुनरावृत्ति नहीं करता है, लेकिन जब मुझे यह समाधान मिला तो मुझे अब पुनरावृत्ति की परवाह नहीं थी, इसलिए आप भी नहीं कर सकते हैं):

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

1
हालांकि यह शायद उपनिर्देशिकाओं के माध्यम से पुनरावृत्ति नहीं करता है। हालाँकि: फाइलों को अलग करने और उन सभी को एक साथ आयात करने के लिए मेरे उद्देश्यों के लिए काम किया गया :)
ChrisPrime

दुर्भाग्य से यह सवाल "एक निर्देशिका (पुनरावर्ती) में सभी फाइलों" का जवाब नहीं देता है। यह केवल वर्तमान निर्देशिका को सूचीबद्ध करेगा और संदर्भ में भ्रामक है।
ottago

fileTreerecurses।
नोएल याप

FileTreeनिर्देशिकाओं को शामिल नहीं करता है (फ़ाइलों के रूप में उनका इलाज नहीं)।
DNax

1

यह वह है जो मैं एक निर्माण बिल्ड स्क्रिप्ट के लिए आया था:

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 आयात करना पड़ता है। ढाल स्क्रिप्ट पसंद नहीं है। इसलिए मैंने अभी एक फाइल बनाई है जो एक डायरेक्टरी मिलने पर खुद को कॉल करने वाली फाइलों की तलाश में है।
टिमोथी स्ट्रंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.