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?

hardPass
la source
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.

Mostafa
la source
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
123

Vous pouvez utiliser ceci:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Voir: http://golang.org/pkg/os/#IsNotExist

Denys Séguret
la source
6
C'est mieux que la réponse acceptée, mais la clause else est-elle vraiment nécessaire?
Sergey Koulikov
9
@SergeyKoulikov Il pourrait y avoir d'autres erreurs, comme une permission.
Denys Séguret
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 ().

Edward Wagner
la source
-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
    }
}
Kabeer Shaikh
la source
C'est un double de la réponse de Denys Séguret.
StardustGogeta