Как создать вложенные каталоги с помощью Mkdir в Golang?

Я пытаюсь создать набор вложенных каталогов из исполняемого файла Go, такого как'dir1/dir2/dir3'. Мне удалось создать один каталог с этой строкой:

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

но я понятия не имею, как подойти к созданию предопределенного вложенного набора каталогов внутри этого каталога, и мой Google Fu не так силен, как я думал.

спасибо заранее!

3 ответов


os.Mkdir используется для создания одного каталога. Чтобы создать путь к папке, вместо этого попробуйте использовать:

os.MkdirAll(folderPath, os.ModePerm);

перейти документации

func MkdirAll (строка пути, perm FileMode) ошибка

MkdirAll создает каталог с именем path вместе с любыми необходимыми родителями и возвращает nil или возвращает ошибку. Биты разрешений perm используются для всех каталогов, которые создает MkdirAll. Если path уже является каталогом, MkdirAll ничего не делает и возвращает nil.

Edit:

обновлено для правильного использования os.ModePerm вместо.
Для объединения путей к файлам используйте package path/filepath как описано в ответе @Chris.


таким образом, вам не нужно использовать магические числа:

os.MkdirAll(newPath, os.ModePerm)

кроме того, вместо использования + для создания путей вы можете использовать:

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

вышеуказанное использует правильные разделители автоматически на каждой платформе для вас.


Если проблема заключается в создании всех необходимых родительских каталогов, вы можете рассмотреть возможность использования 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_")
...
}

(обязательно указать разумное значение разрешения, как указано в этот ответ)