我正在学习golang(beginner),并且一直在google和stackoverflow上搜索,但是找不到答案,所以请问一下是否可以打扰我,但是如果golang中不存在该怎么办?
例如,在节点中,我将使用带有功能sureDirSync的fs-extra (如果当然不关心阻塞)
fs.ensureDir("./public");
我正在学习golang(beginner),并且一直在google和stackoverflow上搜索,但是找不到答案,所以请问一下是否可以打扰我,但是如果golang中不存在该怎么办?
例如,在节点中,我将使用带有功能sureDirSync的fs-extra (如果当然不关心阻塞)
fs.ensureDir("./public");
Answers:
我遇到过两种方法:
检查目录是否存在,如果不存在则创建它:
if _, err := os.Stat(path); os.IsNotExist(err) {
os.Mkdir(path, mode)
}
尝试创建目录并忽略任何问题:
_ = os.Mkdir(path, mode)
os.ModeDir
。新目录没有足够的权限。我发现只os.ModePerm
为我工作。相当于0777
或drwxr-xr-x
。我认为权限可能会低一些,但0666
没有成功。
好吧,我想出了这个问题/答案
import(
"os"
"path/filepath"
)
newpath := filepath.Join(".", "public")
os.MkdirAll(newpath, os.ModePerm)
MkdirAll创建一个名为path的目录以及所有必要的父目录,并返回
nil
,否则返回error
。
filepath.Dir("path/to/file")
的文件的完整路径是在我的眼前一个不错的方法。
这是达到相同目的的一种选择,但是它避免了由于具有两个不同的“检查和创建”操作而引起的竞争状态。
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
}
}
因此,我发现对我有用的是:
//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)
}
我喜欢它的便携性。
mode
是什么的人,请参阅:golang.org/pkg/os/#FileMode。您可能希望将os.ModeDir
其用作值。