148 votes

mkdir si n'existe pas en utilisant golang

Je suis en train d'apprendre golang (débutant) et j'ai cherché à la fois sur google et stackoverflow mais je n'ai pas pu trouver de réponse alors excusez-moi si la question a déjà été posée, mais comment puis-je mkdir if not exists dans golang.

Par exemple, dans node, j'utiliserais fs-extra avec la fonction ensureDirSync (si le blocage n'est pas un problème bien sûr)

fs.ensureDir("./public");

233voto

Alfred Points 32190

Ok, j'ai trouvé grâce à ça question/réponse

import(
    "os"
    "path/filepath"
)

newpath := filepath.Join(".", "public")
err := os.MkdirAll(newpath, os.ModePerm)
// TODO: handle error

Documentation Go pertinente pour MkdirAll :

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

...

Si path est déjà un répertoire, MkdirAll ne fait rien. et retourne nil.

9 votes

C'est la meilleure réponse, et elle utilise la stdlib. C'est particulièrement utile lorsqu'il est utilisé avec os.Create, où vous pouvez avoir besoin de créer des sous-répertoires également (en utilisant la commande filepath.Dir("path/to/file") sur le chemin complet du fichier est une bonne approche à mes yeux.

6 votes

Vous pouvez vérifier s'il y a une réponse d'erreur sur l'appel de MkdirAll comme : ` if err := os.MkdirAll("/somepath/", os.ModeDir) ; err != nil { fmt.Println("Cannot create hidden directory.") } `

194voto

Berdon Points 5388

J'ai rencontré deux méthodes :

  1. Vérifie l'existence du répertoire et le crée s'il n'existe pas :

    if _, err := os.Stat(path); os.IsNotExist(err) {
        err := os.Mkdir(path, mode)
        // TODO: handle error
    }

Cependant, ceci est susceptible d'une condition de course : le chemin peut être créé par quelqu'un d'autre entre le fichier d'enregistrement de l'utilisateur et le fichier d'enregistrement de l'utilisateur. os.Stat et l'appel os.Mkdir appeler.

  1. Essayez de créer le répertoire et ignorez les problèmes éventuels (il n'est pas recommandé d'ignorer l'erreur) :

    _ = os.Mkdir(path, mode)

57 votes

Pour tous ceux qui se demandent ce que la variable mode est, voir : golang.org/pkg/os/#FileMode . Vous voulez probablement utiliser os.ModeDir comme sa valeur.

9 votes

Aussi, pour ceux qui s'interrogent sur le mode vous pouvez utiliser os.Mkdir("dirname", 0700) si vous voulez pouvoir écrire dans ce répertoire à partir du même programme, voir ce pour plus de détails.

5 votes

Pourquoi ignorons-nous tous les problèmes lorsque nous faisons os.Mkdir() ?

9voto

Il s'agit d'une alternative pour obtenir le même résultat, mais elle permet d'éviter les situations de course causées par deux opérations distinctes "vérifier et créer".

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.Mkdir(dirName, os.ModeDir)
    if err == nil {
        return nil
    }
    if os.IsExist(err) {
        // check that the existing path is a directory
        info, err := os.Stat(dirName)
        if err != nil {
            return err
        }
        if !info.IsDir() {
            return errors.New("path exists but is not a directory")
        }
        return nil
    }
    return err  
}

0 votes

Bien que votre code puisse fournir la réponse à la question, veuillez l'entourer d'un contexte afin que les autres aient une idée de ce qu'il fait et pourquoi il est là.

2 votes

Cette réponse est partiellement incorrecte. Le site os.IsExist(err) s'enregistrer ensureDir n'est pas suffisant : le chemin existant n'est pas nécessairement un répertoire. Ainsi, ensureDir retournera une erreur nulle, mais en fin de compte l'élément au chemin peut ne pas être un répertoire (il peut s'agir d'un fichier reguar, par exemple).

0 votes

J'ai abordé le problème décrit dans mon commentaire précédent dans une modification de cette réponse.

7voto

Mr. Llama Points 4977

Vous pouvez utiliser os.Stat pour vérifier si un chemin donné existe.
Si ce n'est pas le cas, vous pouvez utiliser os.Mkdir pour le créer.

4voto

just_myles Points 215

Donc ce que j'ai trouvé qui fonctionne pour moi est :

//Get the base file dir
path, err := os.Getwd()
if err != nil {
    log.Println("error msg", err)
}

//Create output path
outPath:= filepath.Join(path, "output")

//Create dir output using above code
if _, err := os.Stat(outPath); os.IsNotExist(err) {
    os.Mkdir(outPath, 0755)
}

J'aime la portabilité de cet appareil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X