Mkdir, если не существует, используя golang

Я изучаю golang (новичок), и я искал как google, так и stackoverflow, но я не мог найти ответ, поэтому извините меня, если его уже спросили, но как я могу mkdir, если не существует в golang.

Например, в node я бы использовал fs-extra с функцией protectDirSync (если блокирование, конечно, не вызывает беспокойства)

fs.ensureDir("./public");

Ответы

Ответ 1

Я столкнулся двумя способами:

  • Проверьте существование каталога и создайте его, если он не существует:

    if _, err := os.Stat(path); os.IsNotExist(err) {
        os.Mkdir(path, mode)
    }
    
  • Попытка создать каталог и игнорировать любые проблемы:

    _ = os.Mkdir(path, mode)
    

Ответ 2

Хорошо, я понял это благодаря этому вопросу/ответу

import(
    "os"
    "path/filepath"
)

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

MkdirAll создает каталог с именем path вместе со всеми необходимыми родителями и возвращает nil, либо возвращает error.

Ответ 3

Вы можете использовать os.Stat чтобы проверить, существует ли данный путь.
Если это не так, вы можете использовать os.Mkdir для его создания.

Ответ 4

Это одна альтернатива для достижения того же самого, но она позволяет избежать состояния гонки, вызванного наличием двух разных операций "проверить.. и.. создать".

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
    }
}