web-dev-qa-db-fra.com

Comment vérifier si un fichier existe dans Go?

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?

368
Sridhar Ratnakumar

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


}
624
Sridhar Ratnakumar

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 simplement os.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 utiliser os.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

112
OscarRyz

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 .

29
user11617

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
}
15
user3431012
    _, 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)
    }
10
tangxinfa

L'exemple de fonction:

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

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
} 
3
Farhaan Bukhsh