varios una subdirectorios subcarpetas otra directorios dentro crear consola como carpetas carpeta arbol go mkdir

una - ¿Cómo crear directorios anidados usando Mkdir en Golang?



crear carpetas en linux (5)

Estoy tratando de crear un conjunto de directorios anidados a partir de un ejecutable Go como ''dir1 / dir2 / dir3''. He logrado crear un solo directorio con esta línea:

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

Sin embargo, no tengo idea de cómo abordar la creación de un conjunto anidado predeterminado de directorios dentro de ese directorio.


De esta manera no tienes que usar ningún número mágico:

os.MkdirAll(newPath, os.ModePerm)

Además, en lugar de usar + para crear rutas, puede usar:

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

Lo anterior utiliza los separadores correctos automáticamente en cada plataforma para usted.


Esta es una alternativa para lograr lo mismo, pero evita la condición de carrera causada por tener dos operaciones distintas de "verificar ... y ... crear".

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 } }


Se puede usar un método de utilidad como el siguiente para resolver esto.

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


Si el problema es crear todos los directorios principales necesarios, puede considerar usar os.MkDirAll()

MkdirAll crea un directorio llamado ruta, junto con los padres necesarios, y devuelve nil, o devuelve un error.

path_test.go es una buena ilustración de cómo usarlo:

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

(Asegúrese de especificar un valor de permiso razonable, como se menciona en esta respuesta )


os.Mkdir se usa para crear un solo directorio. Para crear una ruta de carpeta, intente usar:

os.MkdirAll(folderPath, os.ModePerm)

Ir documentación

func MkdirAll (cadena de ruta, perm FileMode) error

MkdirAll crea un directorio llamado ruta, junto con los padres necesarios, y devuelve nil, o devuelve un error. Los permisos de permisos permanentes se utilizan para todos los directorios que crea MkdirAll. Si la ruta ya es un directorio, MkdirAll no hace nada y devuelve nil.

Editar:

Actualizado para usar correctamente os.ModePerm en os.ModePerm lugar.
Para la concatenación de rutas de archivos, use la path/filepath paquete path/filepath de archivos como se describe en la respuesta de @Chris.