Comment vérifier si un fichier existe dans Go?

La bibliothèque standard de Go n’a pas de fonction uniquement destinée à vérifier si un fichier existe ou non (comme os.path.exists de Python). Quelle est la manière idiomatique de le faire?

Pour vérifier si un fichier n’existe pas, équivalent à celui de Python if not os.path.exists(filename) :

 if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) { // path/to/whatever does not exist } 

Pour vérifier si un fichier existe, équivalent à celui de if os.path.exists(filename) Python if os.path.exists(filename) :

 if _, err := os.Stat("/path/to/whatever"); err == nil { // path/to/whatever exists } // the path does not exist or some error occurred. 

Réponse de Caleb Spare posté dans la liste de diffusion gonuts .

[…] Ce n’est pas vraiment nécessaire très souvent et utiliser os.Stat est assez facile pour les cas où il est requirejs.

[…] Par exemple: si vous ouvrez le fichier, il n’y a aucune raison de vérifier s’il existe en premier. Le fichier pourrait disparaître entre la vérification et l’ouverture, et de toute façon, vous devrez vérifier l’erreur os.Open , peu importe. Donc, il vous suffit d’appeler os.IsNotExist(err) après avoir essayé d’ouvrir le fichier et d’y faire face (si cela nécessite un traitement spécial).

[…] Vous n’avez pas besoin de vérifier les chemins existants (et vous ne devriez pas le faire).

  • os.MkdirAll fonctionne que les chemins existent ou non. (Vous devez également vérifier l’erreur de cet appel.)

  • Au lieu d’utiliser os.Create , vous devez utiliser os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) . De cette façon, vous obtenez une erreur si le fichier existe déjà. Cela n’a pas non plus de condition de concurrence avec quelque chose d’autre qui crée le fichier, contrairement à votre version qui vérifie l’existence au préalable.

Tiré de: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J

Vous devez utiliser les fonctions os.Stat() et os.IsNotExist() comme dans l’exemple suivant:

 // Exists reports whether the named file or directory exists. func Exists(name ssortingng) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { return false } } return true } 

L’exemple est extrait d’ ici .

  _, err := os.Stat(file) if err == nil { log.Printf("file %s exists", file) } else if os.IsNotExist(err) { log.Printf("file %s not exists", file) } else { log.Printf("file %s stat error: %v", file, err) } 

L’ exemple par user11617 est incorrect; il signalera que le fichier existe même dans les cas où il n’en existe pas, mais il y a eu une autre erreur.

La signature doit être Exist (ssortingng) (bool, error). Et puis, les sites d’appel ne sont pas meilleurs.

Le code qu’il écrivait ferait mieux comme:

 func Exists(name ssortingng) bool { _, err := os.Stat(name) return !os.IsNotExist(err) } 

Mais je suggère plutôt cela:

 func Exists(name ssortingng) (bool, error) { err := os.Stat(name) if os.IsNotExist(err) { return false, nil } return err != nil, err } 

L’exemple de fonction:

 func file_is_exists(f ssortingng) bool { _, err := os.Stat(f) if os.IsNotExist(err) { return false } return err == nil } 

Voyons d’abord quelques aspects, à la fois la fonction fournie par os package de golang ne sont pas des utilitaires mais des vérificateurs d’erreurs, ce que je veux dire par là, c’est qu’ils ne sont qu’un wrapper pour gérer les erreurs sur plusieurs plateformes.

Donc, fondamentalement, si os.Stat si cette fonction ne donne aucune erreur, cela signifie que le fichier existe déjà si vous avez besoin de vérifier quel type d’erreur il s’agit, voici l’utilisation de ces deux fonctions os.IsNotExist et os.IsExist .

Cela peut être compris comme la Stat de l’erreur de lancement de fichier car elle n’existe pas ou est-ce une erreur de diffusion parce qu’elle existe et que cela pose un problème.

Le paramètre pris par ces fonctions est de type error , bien que vous puissiez peut-être le transmettre à nil , mais cela n’aurait aucun sens.

Ceci indique également que IsExist is not same as !IsNotExist , ce sont deux choses différentes.

Alors maintenant, si vous voulez savoir si un fichier donné existe déjà, je préférerais que ce soit:

 if _, err := os.Stat(path/to/file); !os.IsNotExist(err){ //TODO }