La bibliothèque standard de Go n'a pas de fonction destinée uniquement à vérifier si un fichier existe ou non (comme dans Python os.path.exists
). Quelle est la manière idiomatique de le faire?
Pour vérifier si un fichier n'existe pas, équivalent à if not os.path.exists(filename)
de Python:
if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
// path/to/whatever does not exist
}
Pour vérifier si un fichier existe, équivalent à if os.path.exists(filename)
de Python:
Edité: par commentaires récents
if _, err := os.Stat("/path/to/whatever"); err == nil {
// path/to/whatever exists
} else if os.IsNotExist(err) {
// path/to/whatever does *not* exist
} else {
// Schrodinger: file may or may not exist. See err for details.
// Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence
}
Answer by 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 simple pour les cas où cela est nécessaire.[...] Par exemple: si vous allez ouvrir 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 vous devrez quand même vérifier l’erreur
os.Open
de toute façon. Donc, vous appelez simplementos.IsNotExist(err)
après avoir essayé d'ouvrir le fichier et vous êtes occupé de sa non-existence là-bas (si cela nécessite un traitement spécial).[...] Vous n'avez pas besoin de vérifier les chemins existants (et vous ne devriez pas).
os.MkdirAll
fonctionne que les chemins existent déjà ou non. (Vous devez également vérifier l'erreur de cet appel.)Au lieu d'utiliser
os.Create
, vous devez utiliseros.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
. De cette façon, vous obtiendrez une erreur si le fichier existe déjà. De plus, il n’ya pas de situation de concurrence critique dans la création du fichier, contrairement à votre version qui en vérifie l’existence au préalable.
Extrait 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 string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
L'exemple est extrait de here .
Le exemple de user11617 est incorrect; il signalera que le fichier existe même dans les cas où ce n'est pas le cas, mais qu'il y a eu une erreur d'une autre sorte.
La signature doit être Exists (chaîne) (bool, error). Et puis, il se trouve que les sites d’appel ne sont pas meilleurs.
Le code qu'il a écrit serait mieux comme:
func Exists(name string) bool {
_, err := os.Stat(name)
return !os.IsNotExist(err)
}
Mais je suggère plutôt ceci:
func Exists(name string) (bool, error) {
_, err := os.Stat(name)
if os.IsNotExist(err) {
return false, nil
}
return err != nil, err
}
_, 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 de fonction:
func file_is_exists(f string) bool {
_, err := os.Stat(f)
if os.IsNotExist(err) {
return false
}
return err == nil
}
Examinons d’abord quelques aspects. Les fonctions fournies par os
paquet de golang
ne sont pas des utilitaires, mais des vérificateurs d’erreur. Je veux dire par là qu’elles ne sont qu’une enveloppe permettant de gérer les erreurs sur plusieurs plates-formes.
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 son type, voici l’utilisation de ces deux fonctions os.IsNotExist
et os.IsExist
.
Cela peut être compris comme étant le Stat
de l'erreur de projection de fichier car il n'existe pas ou est une erreur de projection parce qu'il existe et qu'il y a un problème avec elle.
Le paramètre que prennent ces fonctions est de type error
, bien que vous puissiez éventuellement y passer nil
mais cela n’a aucun sens.
Cela indique également que IsExist is not same as !IsNotExist
, ce sont deux choses bien différentes.
Alors maintenant, si vous voulez savoir si un fichier donné existe au go, je préférerais le meilleur moyen est:
if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
//TODO
}