Comment créer des répertoires imbriqués en utilisant mkdir dans Golang?

J'essaie de créer un ensemble de répertoires imbriqués à partir d'un exécutable Go tel que 'dir1/dir2/dir3'. J'ai réussi à créer un seul répertoire avec cette ligne:

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

Mais je n'ai aucune idée de comment aborder la création d'un ensemble imbriqué prédéterminé de répertoires à l'intérieur de ce répertoire et mon google Fu n'est pas aussi fort que je le pensais.

Merci d'avance!

45
demandé sur tommymcdonald 2015-02-11 10:15:16

3 réponses

os.Mkdir est utilisé pour créer un répertoire unique. Pour créer un chemin de dossier, essayez plutôt d'utiliser:

os.MkdirAll(folderPath, os.ModePerm);

Aller documentation

Func mkdirall(chaîne de chemin, perm FileMode) erreur

Mkdirall crée un répertoire nommé path, avec tous les parents nécessaires, et renvoie nil, sinon renvoie une erreur. Les bits d'autorisation perm sont utilisés pour tous les répertoires créés par MkdirAll. Si path est déjà un répertoire, MkdirAll ne fait rien et retourne nul.

Modifier:

Mis à Jour pour utiliser correctement os.ModePerm à la place.
Pour la concaténation des chemins de fichier, utilisez package path/filepath comme décrit dans la réponse de @Chris.

81
répondu ANisus 2017-07-17 15:00:04

De cette façon, vous n'avez pas à utiliser de nombres magiques:

os.MkdirAll(newPath, os.ModePerm)

En outre, plutôt que d'utiliser + pour créer des chemins, vous pouvez utiliser:

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

Ce qui précède utilise les séparateurs corrects automatiquement sur chaque plate-forme pour vous.

64
répondu Chris 2015-12-24 10:52:37

Si le problème est de créer tous les répertoires parents nécessaires, vous pouvez envisager d'utiliser os.MkDirAll()

MkdirAll crée un répertoire nommé path, avec tous les parents nécessaires, et renvoie nil, ou bien renvoie une erreur.

Le path_test.aller est une bonne illustration de la façon de l'utiliser:

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

(Assurez-vous de spécifier une valeur d'autorisation raisonnable, comme mentionné dans cette réponse )

4
répondu VonC 2017-05-23 11:47:29