গোলংয়ে এমকিডির ব্যবহার করে কীভাবে নেস্টেড ডিরেক্টরি তৈরি করবেন?


97

আমি গো এক্সিকিউটেবল যেমন 'dir1 / dir2 / dir3' থেকে নেস্টেড ডিরেক্টরিগুলির একটি সেট তৈরি করার চেষ্টা করছি। আমি এই লাইনটি দিয়ে একটি একক ডিরেক্টরি তৈরি করতে সফল হয়েছি:

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

তবে, সেই ডিরেক্টরিটির অভ্যন্তরে ডিরেক্টরিগুলির পূর্বনির্ধারিত নেস্টেট সেট তৈরি করার জন্য আমার কোনও ধারণা নেই।

উত্তর:


182

os.Mkdirএকটি একক ডিরেক্টরি তৈরি করতে ব্যবহৃত হয়। একটি ফোল্ডার পাথ তৈরি করতে, পরিবর্তে ব্যবহার করে দেখুন:

os.MkdirAll(folderPath, os.ModePerm)

ডকুমেন্টেশন যান

func MkdirAll (পথের স্ট্রিং, পারম ফাইলমোড) ত্রুটি

এমকিডিআর সমস্ত প্রয়োজনীয় পিতা-মাতার সাথে একটি পাথ নামের একটি ডিরেক্টরি তৈরি করে এবং শূন্য করে দেয়, অন্যথায় ত্রুটি ফিরে আসে। এম বিডিআরএল তৈরি করা সমস্ত ডিরেক্টরিগুলির জন্য অনুমতি বিটস পারম ব্যবহার করা হয়। যদি পথটি ইতিমধ্যে ডিরেক্টরি হয় তবে এমকিডিরএল কিছুই করে না এবং শূন্য করে।

সম্পাদনা করুন:

os.ModePermপরিবর্তে সঠিকভাবে ব্যবহার আপডেট হয়েছে ।
ফাইল পাথের path/filepathসংমিশ্রনের জন্য @ ক্রিসের উত্তরে বর্ণিত প্যাকেজটি ব্যবহার করুন ।


@ কোড ওয়ারিয়র: পিংয়ের জন্য ধন্যবাদ আমি আমার উত্তর আপডেট করেছি এবং ক্রিসকে
উন্নীত করেছি

আপনাকে ধন্যবাদ ক্রিস! :)
থলেস পি

4
আপনি 0755এবং এর মধ্যে বেছে নিতে পারেন os.ModePerm
আপডেটগ্লিউ

103

এইভাবে আপনাকে কোনও যাদু নম্বর ব্যবহার করতে হবে না:

os.MkdirAll(newPath, os.ModePerm)

এছাড়াও, পাথ তৈরি করতে + ব্যবহার করার পরিবর্তে আপনি ব্যবহার করতে পারেন:

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

উপরেরগুলি প্রতিটি প্ল্যাটফর্মে স্বয়ংক্রিয়ভাবে সঠিক বিভাজকগুলি ব্যবহার করে।


4
এটা সঠিক উত্তর. অনেক সহজ এবং প্ল্যাটফর্ম অজিনস্টিক।
ড্যান এস্পারজা

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
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.