Comment vérifier si un fichier ou un répertoire existe?


131

Je veux vérifier l'existence d'un fichier ./conf/app.inidans mon code Go, mais je ne trouve pas de bon moyen de le faire.

Je sais qu'il existe une méthode de File en Java:, public boolean exists()qui renvoie true si le fichier ou le répertoire existe.

Mais comment cela peut-il être fait dans Go?


7
Notez également que selon la façon dont vous allez utiliser ces informations, vous avez une condition de concurrence. Tout ce que vous pouvez dire, c'est qu'il y a peu de temps, le fichier existait / n'existait pas; au moment où vous agissez sur le test, le contraire peut être vrai. Habituellement, il est préférable de vérifier tout en effectuant l'opération que vous avez l'intention de faire (par exemple, ne vérifiez pas avant d'ouvrir un fichier existant ou de créer un nouveau fichier, mais faites f, err := os.Open(name)ou f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)puis vérifiez os.IsNotExist(err)).
Dave C

Réponses:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Modifié pour ajouter la gestion des erreurs.


4
Cela ressemble à une «programmation d'exception» pour moi. Existe-t-il une ressource qui justifie ce type de code en tant que paradigme officiel du #golang?
Olivier Amblet

21
@OlivierAmblet Il n'y a pas d'exception ici. Go utilise panicpour un objet comme "exception" réel. Vous pouvez «attraper» avec un appel à recover. Le renvoi explicite d'un errcomme deuxième valeur de retour est une technique de Go idiomatique extrêmement courante. Voir: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
la solution n'est pas très straitforward, go is special
zhaozhi

1
Il est vrai qu'il n'y a pas de fonction booléenne Exists, mais le code de l'application peut être plus simple si vous voulez seulement vérifier l'existence d'un fichier:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Pourquoi tout dans cette langue est-il si compliqué?
Top Cat


22

Plus d'un FYI, puisque j'ai regardé autour de moi pendant quelques minutes en pensant que ma question était une recherche rapide.

Comment vérifier si le chemin représente un répertoire existant dans Go?

C'était la réponse la plus populaire dans mes résultats de recherche, mais ici et ailleurs, les solutions ne fournissent qu'un contrôle d'existence. Pour vérifier si pathreprésente un répertoire existant, j'ai trouvé que je pouvais facilement:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Une partie de mon problème était que je m'attendais path/filepathà ce que le package contienne la fonction isDir ().



-2

Il existe un moyen simple de vérifier si votre fichier existe ou non:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

C'est un double de la réponse de Denys Séguret.
StardustGogeta
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.