2015-02-11 175 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

相關問題