गोलंग में Mkdir का उपयोग करके नेस्टेड निर्देशिका कैसे बनाएं?


95

मैं एक गो निष्पादन योग्य जैसे 'dir1 / dir2 / dir3' से नेस्टेड निर्देशिकाओं का एक सेट बनाने की कोशिश कर रहा हूं। मैं इस पंक्ति के साथ एक एकल निर्देशिका बनाने में सफल रहा:

os.Mkdir("." + string(filepath.Separator) + c.Args().First(),0777);

हालाँकि, मुझे पता नहीं है कि उस निर्देशिका के अंदर पूर्वनिर्धारित नेस्टेड सेट बनाने के लिए कैसे संपर्क किया जाए।

जवाबों:


176

os.Mkdirएकल निर्देशिका बनाने के लिए उपयोग किया जाता है। एक फ़ोल्डर पथ बनाने के लिए, इसके बजाय उपयोग करने का प्रयास करें:

os.MkdirAll(folderPath, os.ModePerm)

प्रलेखन जाओ

func MkdirAll (path string, perm FileMode) त्रुटि

MkdirAll किसी भी आवश्यक माता-पिता के साथ पथ नाम की एक निर्देशिका बनाता है, और शून्य देता है, या फिर कोई त्रुटि देता है। अनुमति बिट्स का उपयोग उन सभी निर्देशिकाओं के लिए किया जाता है जो MkdirAll बनाता है। यदि पथ पहले से ही एक निर्देशिका है, तो MkdirAll कुछ नहीं करता है और शून्य लौटाता है।

संपादित करें:

os.ModePermइसके बजाय सही ढंग से उपयोग करने के लिए अद्यतन किया गया ।
फ़ाइल रास्तों के path/filepathसंघटन के लिए, @ क्रिस के उत्तर में वर्णित पैकेज का उपयोग करें ।


@ कोडवर्ड: पिंग के लिए धन्यवाद। मैंने अपना जवाब अपडेट किया और क्रिस
एनिसस जूल

शुक्रिया @chris! :)
थेल्स पी

1
आप 0755और के बीच चयन करना चाह सकते हैं os.ModePerm
updogliu

102

इस तरह आपको किसी मैजिक नंबर का उपयोग नहीं करना है:

os.MkdirAll(newPath, os.ModePerm)

पथ बनाने के लिए + का उपयोग करने के बजाय, आप उपयोग कर सकते हैं:

import "path/filepath"
path := filepath.Join(someRootPath, someSubPath)

उपरोक्त आपके लिए प्रत्येक प्लेटफ़ॉर्म पर स्वचालित रूप से सही विभाजक का उपयोग करता है।


2
यह सही जवाब है। बहुत सरल और मंच अज्ञेय।
दान एस्परज़ा

6

यदि समस्या सभी आवश्यक मूल निर्देशिका बनाने की है, तो आप उपयोग करने पर विचार कर सकते हैं os.MkDirAll()

MkdirAll किसी भी आवश्यक माता-पिता के साथ पथ नाम की एक निर्देशिका बनाता है, और शून्य देता है, अन्यथा कोई त्रुटि देता है।

Path_test.go कि यह कैसे उपयोग करने के लिए पर एक अच्छा उदाहरण है:

func TestMkdirAll(t *testing.T) {
    tmpDir := TempDir()
    path := tmpDir + "/_TestMkdirAll_/dir/./dir2"
    err := MkdirAll(path, 0777)
    if err != nil {
    t.Fatalf("MkdirAll %q: %s", path, err)
    }
    defer RemoveAll(tmpDir + "/_TestMkdirAll_")
...
}

( इस उत्तर में बताए अनुसार एक समझदार अनुमति मूल्य निर्दिष्ट करना सुनिश्चित करें )


3

इसे हल करने के लिए निम्न की तरह एक उपयोगिता विधि का उपयोग किया जा सकता है।

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

func ensureDir(fileName string) {
  dirName := filepath.Dir(fileName)
  if _, serr := os.Stat(dirName); serr != nil {
    merr := os.MkdirAll(dirName, os.ModePerm)
    if merr != nil {
        panic(merr)
    }
  }
}



func main() {
  _, cerr := os.Create("a/b/c/d.txt")
  if cerr != nil {
    log.Fatal("error creating a/b/c", cerr)
  }
  log.Println("created file in a sub-directory.")
}

1

यह उसी को प्राप्त करने के लिए एक विकल्प है, लेकिन यह दो अलग-अलग "चेक .. और .. ऑपरेशन" बनाने के कारण होने वाली दौड़ की स्थिति से बचा जाता है।

package main

import (
    "fmt"
    "os"
)

func main()  {
    if err := ensureDir("/test-dir"); err != nil {
        fmt.Println("Directory creation failed with error: " + err.Error())
        os.Exit(1)
    }
    // Proceed forward
}

func ensureDir(dirName string) error {

    err := os.MkdirAll(dirName, os.ModeDir)

    if err == nil || os.IsExist(err) {
        return nil
    } else {
        return err
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.