web-dev-qa-db-ja.com

golangを使用してmkdirが存在しない場合

私はgolang(初心者)を学んでおり、googleとstackoverflowの両方で検索していますが、答えが見つからなかったので、すでに尋ねられたらすみませんが、golangに存在しない場合はどうすればmkdirできますか?.

たとえば、ノードでは、関数 ensureDirSync でfs-extraを使用します(ブロックがもちろん関係ない場合)

fs.ensureDir("./public");
48
Alfred

私は2つの方法に出くわしました:

  1. ディレクトリの存在を確認し、存在しない場合は作成します。

    if _, err := os.Stat(path); os.IsNotExist(err) {
        os.Mkdir(path, mode)
    }
    
  2. ディレクトリを作成して、問題を無視しようとします。

    _ = os.Mkdir(path, mode)
    
77
Austin Hanson

さて、これのおかげでわかった question/answer

import(
    "os"
    "path/filepath"
)

newpath := filepath.Join(".", "public")
os.MkdirAll(newpath, os.ModePerm)

MkdirAllは必要な親とともにpathという名前のディレクトリを作成し、nilを返すか、errorを返します。

86
Alfred

os.Stat を使用して、特定のパスが存在するかどうかを確認できます。
そうでない場合は、 os.Mkdir を使用して作成できます。

7
Mr. Llama

これは、同じことを達成するための1つの代替手段ですが、2つの別個の「check ..and .. create」操作が原因で発生する競合状態を回避します。

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.Mkdir(dirName, os.ModeDir)

    if err == nil || os.IsExist(err) {
        return nil
    } else {
        return err
    }
}
0