我正在学习 golang (初学者) ,我一直在谷歌和 stackoverflow 上搜索,但我找不到答案,所以如果已经问了,请原谅,但如果不存在的话,我怎么能 mkdir 在 golang。
例如,在节点中,我将与函数 确保同步一起使用 fs-plus (当然,如果阻塞没有关系的话)
fs.ensureDir("./public");
好吧,多亏了这个 问题/答案我想明白了
import( "os" "path/filepath" ) newpath := filepath.Join(".", "public") err := os.MkdirAll(newpath, os.ModePerm) // TODO: handle error
MkdirAll 的相关 Go 文档:
MkdirAll 创建一个名为 path 的目录, 和任何必要的父母一起,然后一无所获, 否则返回错误。 ... 如果 path 已经是一个目录,则 MkdirAll 不执行任何操作 返回 nil
MkdirAll 创建一个名为 path 的目录, 和任何必要的父母一起,然后一无所获, 否则返回错误。
...
如果 path 已经是一个目录,则 MkdirAll 不执行任何操作 返回 nil
我遇到过两种情况:
检查目录是否存在,如果不存在则创建它:
if _, err := os.Stat(path); os.IsNotExist(err) { err := os.Mkdir(path, mode) // TODO: handle error }
但是,这很容易受到竞态条件的影响: 路径可能是由其他人在 os.Stat调用和 os.Mkdir调用之间创建的。
os.Stat
os.Mkdir
尝试创建目录并忽略任何问题(不建议忽略该错误) :
_ = os.Mkdir(path, mode)
这是实现相同目标的一种替代方法,但它避免了由于具有两个不同的“检查”而导致的竞态条件。.还有。.创建”操作。
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 }
因此,我发现适合自己的是:
//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) }
我喜欢这个的便携性。
或者您可以尝试创建该文件,并检查返回的错误是否为“ filevis”错误
if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) { log.Fatal(err) }