जाओ में सूची निर्देशिका


197

मैं यह पता लगाने की कोशिश कर रहा हूं कि गो में केवल एक डायरेक्टरी में फ़ाइलों और फ़ोल्डरों को कैसे सूचीबद्ध किया जाए।

मैंने पाया है filepath.Walk, लेकिन यह स्वचालित रूप से उप-निर्देशिकाओं में चला जाता है, जो मुझे नहीं चाहिए। मेरी अन्य खोजों में से कुछ भी बेहतर नहीं हुआ है।

मुझे यकीन है कि यह कार्यक्षमता मौजूद है, लेकिन इसे ढूंढना वास्तव में कठिन है। मुझे पता है अगर किसी को पता है कि मुझे कहाँ देखना चाहिए। धन्यवाद।

जवाबों:


359

आप पैकेज में ReadDir फ़ंक्शन का उपयोग करके देख सकते हैं io/ioutil। डॉक्स के अनुसार:

ReadDir dirname नाम की निर्देशिका को पढ़ता है और क्रमबद्ध निर्देशिका प्रविष्टियों की एक सूची देता है।

परिणामी स्लाइस में os.FileInfoप्रकार होते हैं, जो यहां सूचीबद्ध तरीकों को प्रदान करते हैं । यहां एक मूल उदाहरण है जो वर्तमान निर्देशिका में सभी चीज़ों के नाम को सूचीबद्ध करता है (फ़ोल्डर शामिल हैं, लेकिन विशेष रूप से चिह्नित नहीं हैं - आप जांच सकते हैं कि क्या कोई आइटम IsDir()विधि का उपयोग करके एक फ़ोल्डर है ):

package main

import (
    "fmt"
    "io/ioutil"
     "log"
)

func main() {
    files, err := ioutil.ReadDir("./")
    if err != nil {
        log.Fatal(err)
    }

    for _, f := range files {
            fmt.Println(f.Name())
    }
}

7
आप केवल चाहते हैं के नाम एक निर्देशिका और गति की सामग्री का सार, ध्यान दें कि उपयोग कर रहा है Readdirnames है परिमाण के आदेश तेजी से (लगभग 20x तेजी से मेरे लिए)
SquattingSlavInTracksuit

2
@SquattingSlavInTracksuit: मैंने आपकी टिप्पणी को यहां एक उत्तर में बढ़ावा दिया, क्योंकि मेरे पास उस समय टिप्पणी विशेषाधिकार नहीं थे। यदि आप इसका उत्तर देते हैं और क्रेडिट प्राप्त करते हैं, तो एलएमके।
याकूब कोप्सकिंस्की

2
@SquattingSlavInTracksuit - यह परिमाण का सिर्फ एक आदेश है: P
nadavvadan

78

और भी सरल, उपयोग path/filepath:

package main    

import (
    "fmt"
    "log"
    "path/filepath"
)

func main() {
    files, err := filepath.Glob("*")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(files) // contains a list of all files in the current directory
}

8
ध्यान दें किGlob ignores file system errors such as I/O errors reading directories. The only possible returned error is ErrBadPattern, when pattern is malformed.
जॉन

3
यह समझने के लिए सुनिश्चित करें कि ग्लोब इसका उपयोग करने से पहले क्या करता है। golang.org/pkg/path/filepath/#Glob
Anfernee

68

हम विभिन्न golang मानक पुस्तकालय कार्यों का उपयोग करके फ़ाइल सिस्टम पर एक फ़ोल्डर के अंदर फ़ाइलों की एक सूची प्राप्त कर सकते हैं।

  1. filepath.Walk
  2. ioutil.ReadDir
  3. os.File.Readdir

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    var (
        root  string
        files []string
        err   error
    )

    root := "/home/manigandan/golang/samples"
    // filepath.Walk
    files, err = FilePathWalkDir(root)
    if err != nil {
        panic(err)
    }
    // ioutil.ReadDir
    files, err = IOReadDir(root)
    if err != nil {
        panic(err)
    }
    //os.File.Readdir
    files, err = OSReadDir(root)
    if err != nil {
        panic(err)
    }

    for _, file := range files {
        fmt.Println(file)
    }
}
  1. Filepath.Walk का उपयोग करना

path/filepathपैकेज, यह स्वतः ही निर्देशिका में प्रत्येक उप-निर्देशिका स्कैन करेगा एक निर्देशिका में सभी फ़ाइलों को स्कैन करने के लिए एक आसान तरीका प्रदान करता है।

func FilePathWalkDir(root string) ([]string, error) {
    var files []string
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            files = append(files, path)
        }
        return nil
    })
    return files, err
}
  1. Ioutil.ReadDir का उपयोग करना

ioutil.ReadDir dirname नाम की डायरेक्टरी को पढ़ता है और फाइलनाम द्वारा सॉर्ट की गई डायरेक्टरी प्रविष्टियों की सूची देता है।

func IOReadDir(root string) ([]string, error) {
    var files []string
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}
  1. Os.File.Readdir का उपयोग करना

रीडडीर फ़ाइल से जुड़ी निर्देशिका की सामग्री को पढ़ता है और n फाइलइन्फो मानों का एक टुकड़ा देता है, जैसा कि निर्देशिका क्रम में Lstat द्वारा लौटाया जाएगा। एक ही फाइल पर बाद में कॉल करने से फाइलइन्फोस आगे बढ़ेगा।

func OSReadDir(root string) ([]string, error) {
    var files []string
    f, err := os.Open(root)
    if err != nil {
        return files, err
    }
    fileInfo, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}

बेंचमार्क परिणाम।

बेंचमार्क स्कोर

इस ब्लॉग पोस्ट पर अधिक जानकारी प्राप्त करें


3
सबसे पूरा जवाब यहाँ। यह ध्यान देने योग्य है कि इस बेंचमार्क द्वारा रिपोर्ट किए गए मेमोरी उपयोग या एलोक नहीं हैं। यह संभव है कि तेज़ कार्यान्वयन अधिक मेमोरी का उपयोग करें। यह भी संभव है कि परीक्षक के कंप्यूटर पर सीपीयू कोर की संख्या में दर्द होता है / समवर्ती में मदद करता है filepath.Walk। इसके अलावा, filepath.Walkका समर्थन करता है सभ्य जबकि पुनरावर्ती os.File.Readdirऔर ioutil.ReadDirनहीं है।
Xeoncross

24

ioutil.ReadDirएक अच्छी खोज है, लेकिन यदि आप क्लिक करते हैं और उस स्रोत को देखते हैं जिसे आप देखते हैं कि यह os.File की रीडडीर विधि है । यदि आप निर्देशिका क्रम के साथ ठीक हैं और सूची को क्रमबद्ध करने की आवश्यकता नहीं है, तो यह रीडडीर विधि आपको चाहिए।


7

आपके विवरण से, आप जो चाहते हैं, वह os.Readdirnames है

func (f *File) Readdirnames(n int) (names []string, err error)

Readdirnames फ़ाइल के साथ जुड़ी निर्देशिका की सामग्री को पढ़ता है और निर्देशिका क्रम में फ़ाइलों के n नामों तक का एक टुकड़ा वापस करता है। एक ही फाइल पर बाद में कॉल करने से आगे के नाम सामने आएंगे।

...

यदि n <= 0, Readdirnames एक ही स्लाइस में डायरेक्टरी से सभी नाम लौटाता है।

स्निपेट:

file, err := os.Open(path)
if err != nil {
    return err
}
names, err := file.Readdirnames(0)
if err != nil {
    return err
}
fmt.Println(names)

क्रेडिट करने के लिए स्क्वाटिंगस्लेव.ट्रैक्यूट की टिप्पणी ; मैंने सुझाव दिया कि अगर मैं कर सकता हूं तो उनकी टिप्पणी को एक उत्तर में बढ़ावा देना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.