2015-02-11 172 views
33

我试图从一个Go可执行文件(如'dir1/dir2/dir3')创建一组嵌套的目录。我已经成功地创造了这条线的单一目录:如何在Golang中使用Mkdir创建嵌套目录?

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

但我不知道如何着手创建目录和我的谷歌赋的内部的规定嵌套组目录并不像我一样强认为这是。

在此先感谢!

回答

62

os.Mkdir用于创建单个目录。要创建一个文件夹路径,而是试图利用:

os.MkdirAll(folderPath, os.ModePerm); 

Go documentation

FUNC MkdirAll(路径字符串,烫发的FileMode)错误

MkdirAll创建一个名为目录路径,与任何必要的父母一起,并返回nil,否则返回错误。许可位perm用于MkdirAll创建的所有目录。如果path已经是一个目录,MkdirAll什么也不做,并返回nil。

编辑:

更新正确使用os.ModePerm代替。
对于文件路径的连接,请使用@Chris'答案中所述的包path/filepath

+0

@CodeWarrior:谢谢你的ping。我更新了我的答案和upvoted Chris – ANisus 2017-07-17 15:00:56

+0

谢谢@chris! :) – CodeWarrior 2017-07-17 18:04:42

4

如果问题是创建所有必需的父目录,你可以考虑使用os.MkDirAll()

MkdirAll创建一个名为目录路径,与任何必要的父母一起,并返回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_") 
... 
} 

(确保指定一个明智的许可值,如this answer提到)

50

这样,你不这样做必须使用任何幻数:

os.MkdirAll(newPath, os.ModePerm) 

此外,而不是使用+来创建pat HS,您可以使用:

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

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

+1

这是正确的答案。更简单和平台不可知论者。 – 2017-05-21 15:45:31

相关问题