2015-02-11 33 views
33

Tôi đang cố tạo một tập hợp các thư mục lồng nhau từ tệp thực thi Go như 'dir1/dir2/dir3'. Tôi đã thành công trong việc tạo ra một thư mục duy nhất với dòng này:Làm thế nào để tạo thư mục lồng nhau bằng Mkdir trong Golang?

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

Nhưng tôi không có ý tưởng làm thế nào để tiếp cận tạo một bộ lồng nhau được xác định trước các thư mục bên trong thư mục đó và Google Fu của tôi là không mạnh như tôi nghĩ vậy.

Cảm ơn trước!

Trả lời

62

os.Mkdir được sử dụng để tạo một thư mục duy nhất. Để tạo ra một đường dẫn thư mục, thay vì cố gắng sử dụng:

os.MkdirAll(folderPath, os.ModePerm); 

Go documentation

func MkdirAll (string path, perm chế độ File) lỗi

MkdirAll tạo ra một đường dẫn thư mục được đặt tên, cùng với bất kỳ bậc cha mẹ cần thiết và trả về nil, nếu không sẽ trả về lỗi. Các bit quyền hạn được sử dụng cho tất cả các thư mục mà MkdirAll tạo ra. Nếu đường dẫn đã là một thư mục, MkdirAll không làm gì và trả về nil.

Edit:

cập nhật để sử dụng đúng os.ModePerm để thay thế.
Để nối đường dẫn tệp, hãy sử dụng gói path/filepath như được mô tả trong câu trả lời @Chris '.

+0

@CodeWarrior: Cảm ơn bạn đã ping. Tôi đã cập nhật câu trả lời của mình và upvoted Chris – ANisus

+0

Cảm ơn bạn @chris! :) – CodeWarrior

4

Nếu vấn đề là tạo ra tất cả các thư mục mẹ cần thiết, bạn có thể xem xét sử dụng os.MkDirAll()

MkdirAll tạo ra một đường dẫn thư mục được đặt tên, cùng với bất kỳ bậc cha mẹ cần thiết, và trả về NIL, nếu không trả về một lỗi.

Các path_test.go là một minh họa tốt về làm thế nào để sử dụng nó:

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

(Hãy chắc chắn để xác định một giá trị cho phép hợp lý, như đã đề cập trong this answer)

50

Bằng cách này bạn không phải sử dụng bất kỳ số ma thuật nào:

os.MkdirAll(newPath, os.ModePerm) 

Ngoài ra, thay vì sử dụng + để tạo pat hs, bạn có thể sử dụng:

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

Trên đây sử dụng dải phân cách chính xác tự động trên mỗi nền tảng cho bạn.

+1

Đây là câu trả lời đúng. Đơn giản hơn nhiều và nền tảng bất khả tri. –

Các vấn đề liên quan