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