我试图从Go可执行文件创建一组嵌套目录,如'dir1/dir2/dir3'.我已成功使用此行创建单个目录:
os.Mkdir("." + string(filepath.Separator) + c.Args().First(),0777);
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何在该目录内创建预定的嵌套目录集.
ANi*_*sus 134
os.Mkdir用于创建单个目录.要创建文件夹路径,请尝试使用:
os.MkdirAll(folderPath, os.ModePerm)
Run Code Online (Sandbox Code Playgroud)
func MkdirAll(路径字符串,perm FileMode)错误
MkdirAll创建一个名为path的目录以及任何必要的父项,并返回nil,否则返回错误.权限位perm用于MkdirAll创建的所有目录.如果path已经是一个目录,MkdirAll什么也不做,返回nil.
编辑:
更新为正确使用os.ModePerm.
对于文件路径的连接,请path/filepath按@Chris的答案中所述使用包.
Chr*_*ris 84
这样您就不必使用任何幻数:
os.MkdirAll(newPath, os.ModePerm)
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用以下命令而不是使用+来创建路径:
import "path/filepath"
path := filepath.Join(someRootPath, someSubPath)
Run Code Online (Sandbox Code Playgroud)
以上为您自动在每个平台上使用正确的分隔符.
pr-*_*pal 10
这是实现相同目的的一种替代方案,但它避免了由于两个不同的“检查..和..创建”操作而导致的竞争条件。
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.MkdirAll(dirName, os.ModeDir)
if err == nil || os.IsExist(err) {
return nil
} else {
return err
}
}
Run Code Online (Sandbox Code Playgroud)
如果问题是创建所有必要的父目录,您可以考虑使用 os.MkDirAll()
MkdirAll创建一个名为 path 的目录以及任何必要的父目录,并返回 nil,否则返回错误。
该path_test.go是如何使用它的一个很好的例子:
func TestMkdirAll(t *testing.T) {
tmpDir := TempDir()
path := tmpDir + "/_TestMkdirAll_/dir/./dir2"
err := MkdirAll(path, 0777)
if err != nil {
t.Fatalf("MkdirAll %q: %s", path, err)
}
defer RemoveAll(tmpDir + "/_TestMkdirAll_")
...
}
Run Code Online (Sandbox Code Playgroud)
(确保指定合理的权限值,如本答案所述)
可以使用如下实用方法来解决此问题。
import (
"os"
"path/filepath"
"log"
)
func ensureDir(fileName string) {
dirName := filepath.Dir(fileName)
if _, serr := os.Stat(dirName); serr != nil {
merr := os.MkdirAll(dirName, os.ModePerm)
if merr != nil {
panic(merr)
}
}
}
func main() {
_, cerr := os.Create("a/b/c/d.txt")
if cerr != nil {
log.Fatal("error creating a/b/c", cerr)
}
log.Println("created file in a sub-directory.")
}
Run Code Online (Sandbox Code Playgroud)