Я пытаюсь создать набор вложенных каталогов из исполняемого файла Go, такого как dir1 / dir2 / dir3. Мне удалось создать единственный каталог с этой строкой:
os.Mkdir("." + string(filepath.Separator) + c.Args().First(),0777);
Однако я понятия не имею, как подойти к созданию заранее определенного вложенного набора каталогов внутри этого каталога.
0755
иos.ModePerm
.Таким образом, вам не нужно использовать магические числа:
Кроме того, вместо использования + для создания путей вы можете использовать:
import "path/filepath" path := filepath.Join(someRootPath, someSubPath)
Вышеупомянутое автоматически использует правильные разделители на каждой платформе для вас.
источник
Если проблема заключается в создании всех необходимых родительских каталогов, вы можете рассмотреть возможность использования
os.MkDirAll()
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_") ... }
(Обязательно укажите разумное значение разрешения, как указано в этом ответе )
источник
Для решения этой проблемы можно использовать служебный метод, подобный следующему.
import ( "os" "path/filepath" "log" ) func ensureDir(fileName string) { dirName := filepath.Dir(fileName) if _, serr := os.Stat(dirName); serr != nil { merr := os.MkdirAll(dirName, os.ModePerm) if merr != nil { panic(merr) } } } func main() { _, cerr := os.Create("a/b/c/d.txt") if cerr != nil { log.Fatal("error creating a/b/c", cerr) } log.Println("created file in a sub-directory.") }
источник
Это одна из альтернатив для достижения того же, но она позволяет избежать состояния гонки, вызванного наличием двух различных операций «проверка ... и ... создание».
package main import ( "fmt" "os" ) func main() { if err := ensureDir("/test-dir"); err != nil { fmt.Println("Directory creation failed with error: " + err.Error()) os.Exit(1) } // Proceed forward } func ensureDir(dirName string) error { err := os.MkdirAll(dirName, os.ModeDir) if err == nil || os.IsExist(err) { return nil } else { return err } }
источник