如果使用golang不存在mkdir

Alf*_*red 52 go mkdir

我正在学习golang(初学者),我一直在谷歌和stackoverflow上搜索,但我找不到答案,如果已经问过,请原谅我,但我怎么能在golang中存在mkdir.

例如,在节点I中,我将使用带有函数ensureDirSync的 fs-extra (如果阻塞当然无关紧要)

fs.ensureDir("./public");
Run Code Online (Sandbox Code Playgroud)

Alf*_*red 97

好吧,由于这个问题/答案,我想通了

import(
    "os"
    "path/filepath"
)

newpath := filepath.Join(".", "public")
os.MkdirAll(newpath, os.ModePerm)
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,并使用stdlib.当与os.Create一起使用时,这尤其有用,你可能还需要创建子目录(在文件的完整路径上使用`filepath.Dir("path/to/file")`是一个不错的方法我的眼睛. (4认同)
  • 您可能想检查MkdirAll调用上的任何错误响应,如:`if err:= os.MkdirAll("/ somepath /",os.ModeDir); err!= nil {fmt.Println("无法创建隐藏目录.")}` (4认同)

Aus*_*son 85

我遇到过两种方式:

  1. 检查目录是否存在,如果该目录不存在则创建它:

    if _, err := os.Stat(path); os.IsNotExist(err) {
        os.Mkdir(path, mode)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 尝试创建目录并忽略任何问题:

    _ = os.Mkdir(path, mode)
    
    Run Code Online (Sandbox Code Playgroud)

  • 对于任何想知道变量`mode`是什么的人,请访问:https://golang.org/pkg/os/#FileMode。您可能需要使用os.ModeDir作为其值。 (9认同)
  • 另外,对于那些想知道“mode”的人,如果您希望能够从同一程序写入该目录,则可以使用“os.Mkdir("dirname", 0700)”,请参阅[this](https:// stackoverflow.com/questions/14249467/os-mkdir-and-os-mkdirall-permission-value/31151508)了解更多详细信息。 (9认同)
  • 为什么我们在执行 os.Mkdir() 时会忽略任何问题? (5认同)
  • 在`os.ModeDir`模式下创建存储文件的目录时。新目录没有足够的权限。我发现只有 `os.ModePerm` 对我有用。相当于“0777”或“drwxr-xr-x”。我认为权限可以低一点,但“0666”并没有达到目的。 (4认同)
  • 如果其他人在您检查是否存在和创建目录之间创建目录,那么选项 1 不会容易受到竞争条件的影响吗? (3认同)

pr-*_*pal 9

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

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  
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案部分不正确。`ensureDir` 中的 `os.IsExist(err)` 检查是不够的:现有路径不一定是目录。因此 `ensureDir` 将返回 nil 错误,但最终路径中的项目可能不是目录(例如,它可能是常规文件)。 (2认同)

Mr.*_*ama 7

您可以使用os.Stat检查给定路径是否存在.
如果没有,您可以使用os.Mkdir它来创建它.