我正在学习golang(初学者),我一直在谷歌和stackoverflow上搜索,但我找不到答案,所以请原谅我,如果已经问过了,但我怎么能mkdir,如果不存在于golang。例如,在节点中,我将使用fs-extra和函数ensureDirSync(当然,如果阻塞不重要)
fs.ensureDir("./public");
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。
xpcnnkqh2#
我遇到过两种方法:1.检查目录是否存在,如果不存在则创建该目录:
if _, err := os.Stat(path); os.IsNotExist(err) { err := os.Mkdir(path, mode) // TODO: handle error }
但是,这容易受到争用条件的影响:该路径可以由其他人在os.Stat呼叫和os.Mkdir呼叫之间创建。1.尝试创建目录并忽略任何问题(不建议忽略错误):
os.Stat
os.Mkdir
_ = os.Mkdir(path, mode)
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 }
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) }
我喜欢这个的便携性。
wwwo4jvm5#
或者,您可以尝试创建文件并检查返回的错误是否为“文件存在”错误
if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) { log.Fatal(err) }
5条答案
按热度按时间wztqucjr1#
好吧多亏了这个question/answer我才弄明白
MkdirAll的相关Go文档:
MkdirAll创建一个名为path的目录,沿着任何必要的父目录,并返回nil,否则返回一个错误。
...
如果path已经是目录,MkdirAll不执行任何操作并返回nil。
xpcnnkqh2#
我遇到过两种方法:
1.检查目录是否存在,如果不存在则创建该目录:
但是,这容易受到争用条件的影响:该路径可以由其他人在
os.Stat
呼叫和os.Mkdir
呼叫之间创建。1.尝试创建目录并忽略任何问题(不建议忽略错误):
8oomwypt3#
这是实现相同目的的一个备选方案,但它避免了由于具有两个不同的“检查...和...创建”操作而导致的争用条件。
t30tvxxf4#
所以我发现对我有效的是:
我喜欢这个的便携性。
wwwo4jvm5#
或者,您可以尝试创建文件并检查返回的错误是否为“文件存在”错误