mkdir如果不存在则使用golang

zsbz8rwp  于 2023-01-28  发布在  Go
关注(0)|答案(5)|浏览(114)

我正在学习golang(初学者),我一直在谷歌和stackoverflow上搜索,但我找不到答案,所以请原谅我,如果已经问过了,但我怎么能mkdir,如果不存在于golang。
例如,在节点中,我将使用fs-extra和函数ensureDirSync(当然,如果阻塞不重要)

fs.ensureDir("./public");
wztqucjr

wztqucjr1#

好吧多亏了这个question/answer我才弄明白

import(
    "os"
    "path/filepath"
)

newpath := filepath.Join(".", "public")
err := os.MkdirAll(newpath, os.ModePerm)
// TODO: handle error

MkdirAll的相关Go文档:

MkdirAll创建一个名为path的目录,沿着任何必要的父目录,并返回nil,否则返回一个错误。

...

如果path已经是目录,MkdirAll不执行任何操作并返回nil。

xpcnnkqh

xpcnnkqh2#

我遇到过两种方法:
1.检查目录是否存在,如果不存在则创建该目录:

if _, err := os.Stat(path); os.IsNotExist(err) {
    err := os.Mkdir(path, mode)
    // TODO: handle error
}

但是,这容易受到争用条件的影响:该路径可以由其他人在os.Stat呼叫和os.Mkdir呼叫之间创建。
1.尝试创建目录并忽略任何问题(不建议忽略错误):

_ = os.Mkdir(path, mode)
8oomwypt

8oomwypt3#

这是实现相同目的的一个备选方案,但它避免了由于具有两个不同的“检查...和...创建”操作而导致的争用条件。

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 {
        return nil
    }
    if os.IsExist(err) {
        // check that the existing path is a directory
        info, err := os.Stat(dirName)
        if err != nil {
            return err
        }
        if !info.IsDir() {
            return errors.New("path exists but is not a directory")
        }
        return nil
    }
    return err  
}
t30tvxxf

t30tvxxf4#

所以我发现对我有效的是:

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

//Get the base file dir
path, err := os.Getwd()
if err != nil {
    log.Println("error msg", err)
}

//Create output path
outPath:= filepath.Join(path, "output")

//Create dir output using above code
if _, err = os.Stat(outPath); os.IsNotExist(err) {
    if dirMod, err := strconv.ParseUint("0775", 8, 32); err == nil {
        err = os.Mkdir(outPath, os.FileMode(dirMod))
    }
}
if err != nil {
    log.Println("error msg", err)
}

我喜欢这个的便携性。

wwwo4jvm

wwwo4jvm5#

或者,您可以尝试创建文件并检查返回的错误是否为“文件存在”错误

if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) {
    log.Fatal(err)
}

相关问题