mkdir(如果不存在)使用golang


78

我正在学习golang(beginner),并且一直在google和stackoverflow上搜索,但是找不到答案,所以请问一下是否可以打扰我,但是如果golang中不存在该怎么办?

例如,在节点中,我将使用带有功能sureDirSync的fs-extra (如果当然不关心阻塞)

fs.ensureDir("./public");

Answers:


134

我遇到过两种方法:

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

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

    _ = os.Mkdir(path, mode)
    

30
对于任何想知道变量mode是什么的人,请参阅:golang.org/pkg/os/#FileMode。您可能希望将os.ModeDir其用作值。
未知开发人员

4
另外,对于那些对。感兴趣的人mode,可以使用os.Mkdir("dirname", 0700)是否希望从同一程序写入该目录,请参阅以获取更多详细信息。
Jairo Lozano

3
为什么在执行os.Mkdir()时忽略任何问题?
詹尼斯

@Giannis如果已经存在,它将出错,这可以。虽然可能不推荐。
472084,

1
创建目录时以模式存储文件os.ModeDir。新目录没有足够的权限。我发现只os.ModePerm为我工作。相当于0777drwxr-xr-x。我认为权限可能会低一些,但0666没有成功。
贾斯汀

142

好吧,我想出了这个问题/答案

import(
    "os"
    "path/filepath"
)

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

MkdirAll创建一个名为path的目录以及所有必要的父目录,并返回nil,否则返回error


5
这是最好的答案,并且正在使用stdlib。旁边os.Create,你可能需要创建子迪尔斯以及(使用时这是特别有用filepath.Dir("path/to/file")的文件的完整路径是在我的眼前一个不错的方法。
Paddie

6
您可能想检查MkdirAll调用是否有任何错误响应,例如:`if err:= os.MkdirAll(“ / somepath /”,os.ModeDir); !ERR =零{fmt.Println( “无法创建隐藏的目录。”)}`
保罗·福尔廷


2

这是达到相同目的的一种选择,但是它避免了由于具有两个不同的“检查和创建”操作而引起的竞争状态。

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

虽然您的代码可以提供问题的答案,但是请在其周围添加上下文,以便其他人可以知道它的作用以及存在的原因。
西奥(Theo)

0

因此,我发现对我有用的是:

//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) {
    os.Mkdir(outPath, 0755)
}

我喜欢它的便携性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.