mkdir(如果不存在)使用 golang

问题描述 投票:0回答:7

我正在学习 golang(初学者),我一直在 google 和 stackoverflow 上搜索,但我找不到答案,所以如果已经问过,请原谅我,但如果 golang 中不存在,我如何 mkdir 。

例如,在节点中,我将使用 fs-extra 和函数 ensureDirSync(当然,如果不关心阻塞)

fs.ensureDir("./public");
go directory path filepath mkdir
7个回答
232
投票

好吧,多亏了这个问题/答案,我才明白了

import(
    "os"
    "path/filepath"
)

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

MkdirAll 的相关 Go 文档:

MkdirAll 创建一个名为path的目录, 与任何必要的父母一起,并返回零, 否则返回错误。

...

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


193
投票

我遇到过两种方式:

  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)
    

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  
}

4
投票

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

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

//Get the cur file dir
path, err := filepath.Abs("./") // current opened dir (NOT runner dir)

// If you want runner/executable/binary file dir use `_, callerFile, _, _ := runtime.Caller(0)
// path := filepath.Dir(callerFile)`
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) {
    var dirMod uint64
    if dirMod, err = strconv.ParseUint("0775", 8, 32); err == nil {
        err = os.Mkdir(outPath, os.FileMode(dirMod))
    }
}
if err != nil && !os.IsExist(err)  {
    log.Println("error msg", err)
}

我喜欢它的便携性。


1
投票

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

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

0
投票

若目录不存在则创建,可以按照以下步骤操作:

在 Go 程序的开头导入“os”包。 使用“os.Mkdir()”函数创建目录。

package main

import (
    "fmt"
    "os"
)

func main() {
    // Specify the path of the directory you want to create
    directoryPath := "./my_directory"

    // Check if the directory already exists
    if _, err := os.Stat(directoryPath); os.IsNotExist(err) {
        // The directory does not exist, so create it using os.MkdirAll()
        err := os.MkdirAll(directoryPath, 0755) // 0755 sets the permissions for the directory
        if err != nil {
            fmt.Println("Error creating directory:", err)
            return
        }
        fmt.Println("Directory created successfully.")
    } else {
        fmt.Println("Directory already exists.")
    }
}


0
投票

您可以使用它在 golang 中创建新目录:

package main

import (
    "fmt"
    "os"
)

func main() {
    // Specify the directory path you want to create
    dirPath := "my_directory"

    // Create the directory with the specified path
    err := os.Mkdir(dirPath, 0755) // 0755 sets permissions for the directory
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    fmt.Println("Directory created:", dirPath)
}

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.