如何在 Golang 使用 Mkdir 创建嵌套目录?

我试图从一个 Go 可执行文件(如‘ dir1/dir2/dir3’)创建一组嵌套目录。我已经成功地创建了一个包含以下内容的目录:

os.Mkdir("." + string(filepath.Separator) + c.Args().First(),0777);

但是,我不知道如何在该目录中创建一组预先确定的嵌套目录。

146475 次浏览

os.Mkdir用于创建单个目录。要创建文件夹路径,请尝试使用:

os.MkdirAll(folderPath, os.ModePerm)

去找文件

Func MkdirAll (路径字符串,perm FileMode)错误

MkdirAll 创建一个名为 path 的目录,以及任何必要的父目录,并返回 nil,否则返回一个错误。权限位 perm 用于 MkdirAll 创建的所有目录。如果 path 已经是一个目录,则 MkdirAll 不执行任何操作并返回 nil。

编辑:

更新为正确使用 os.ModePerm
对于文件路径的连接,按照@Chris 的回答使用包 path/filepath

如果问题是要创建所有必要的父目录,您可以考虑使用 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_")
...
}

(确保指定一个合理的权限值,如 这个答案中所述)

这样你就不必使用任何神奇的数字:

os.MkdirAll(newPath, os.ModePerm)

此外,与使用 + 创建路径不同,您可以使用:

import "path/filepath"
path := filepath.Join(someRootPath, someSubPath)

以上为您在每个平台上自动使用正确的分隔符。

下面这样的实用方法可以用来解决这个问题。

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.")
}

这是实现相同目标的一种替代方法,但它避免了由于具有两个不同的“检查”而导致的竞态条件。.还有。.创建”操作。

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
}
}