Próbuję utworzyć zestaw zagnieżdżonych katalogów z pliku wykonywalnego Go, takiego jak „dir1 / dir2 / dir3”. Udało mi się stworzyć pojedynczy katalog z tą linią:
os.Mkdir("." + string(filepath.Separator) + c.Args().First(),0777);
Jednak nie mam pojęcia, jak podejść do tworzenia z góry określonego zagnieżdżonego zestawu katalogów w tym katalogu.
0755
ios.ModePerm
.W ten sposób nie musisz używać żadnych magicznych liczb:
Zamiast używać + do tworzenia ścieżek, możesz użyć:
import "path/filepath" path := filepath.Join(someRootPath, someSubPath)
Powyższe automatycznie używa poprawnych separatorów na każdej platformie.
źródło
Jeśli problemem jest utworzenie wszystkich niezbędnych katalogów nadrzędnych, możesz rozważyć użycie
os.MkDirAll()
Path_test.go jest dobrym przykładem tego, jak z niego korzystać:
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_") ... }
(Upewnij się, że podałeś rozsądną wartość pozwolenia, jak wspomniano w tej odpowiedzi )
źródło
Aby rozwiązać ten problem, można użyć metody narzędziowej, takiej jak poniższa.
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.") }
źródło
Jest to jedna z możliwości osiągnięcia tego samego, ale pozwala uniknąć sytuacji wyścigu spowodowanej dwoma różnymi operacjami „sprawdź .. i… utwórz”.
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 } }
źródło