mkdir 如果不存在使用 golang
mkdir if not exists using golang
我正在学习 golang(初学者),我一直在 google 和 Whosebug 上搜索,但我找不到答案,如果已经问过,请原谅,但如果 golang 中不存在,我怎么能 mkdir .
例如,在节点中,我会使用 fs-extra 和函数 ensureDirSync(当然,如果不关心阻塞的话)
fs.ensureDir("./public");
好的,多亏了这个
,我明白了
import(
"os"
"path/filepath"
)
newpath := filepath.Join(".", "public")
err := os.MkdirAll(newpath, os.ModePerm)
// TODO: handle error
MkdirAll 的相关 Go 文档:
MkdirAll creates a directory named path,
along with any necessary parents, and returns nil,
or else returns an error.
...
If path is already a directory, MkdirAll does nothing
and returns nil.
我 运行 有两种方式:
检查目录是否存在,如果不存在则创建:
if _, err := os.Stat(path); os.IsNotExist(err) {
err := os.Mkdir(path, mode)
// TODO: handle error
}
但是,这容易受到竞争条件的影响:路径可能由其他人在 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)
}
我喜欢它的便携性。
或者您可以尝试创建文件并检查返回的错误不是“文件存在”错误
if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) {
log.Fatal(err)
}
我正在学习 golang(初学者),我一直在 google 和 Whosebug 上搜索,但我找不到答案,如果已经问过,请原谅,但如果 golang 中不存在,我怎么能 mkdir .
例如,在节点中,我会使用 fs-extra 和函数 ensureDirSync(当然,如果不关心阻塞的话)
fs.ensureDir("./public");
好的,多亏了这个
import(
"os"
"path/filepath"
)
newpath := filepath.Join(".", "public")
err := os.MkdirAll(newpath, os.ModePerm)
// TODO: handle error
MkdirAll 的相关 Go 文档:
MkdirAll creates a directory named path, along with any necessary parents, and returns nil, or else returns an error.
...
If path is already a directory, MkdirAll does nothing and returns nil.
我 运行 有两种方式:
检查目录是否存在,如果不存在则创建:
if _, err := os.Stat(path); os.IsNotExist(err) { err := os.Mkdir(path, mode) // TODO: handle error }
但是,这容易受到竞争条件的影响:路径可能由其他人在 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)
}
我喜欢它的便携性。
或者您可以尝试创建文件并检查返回的错误不是“文件存在”错误
if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) {
log.Fatal(err)
}