La première chose à considérer est qu'il est rare que vous souhaitiez seulement vérifier si un fichier existe ou non. Dans la plupart des situations, vous essayez de faire quelque chose avec le fichier s'il existe. Dans Go, chaque fois que vous essayez d'effectuer une opération sur un fichier qui n'existe pas, le résultat devrait être une erreur spécifique ( os.ErrNotExist
) et la meilleure chose à faire est de vérifier si le retour err
(par exemple, lors de l'appel d'une fonction telle que os.OpenFile(...)
) est os.ErrNotExist
.
La méthode recommandée pour ce faire utilisé pour être :
file, err := os.OpenFile(...)
if os.IsNotExist(err) {
// handle the case where the file doesn't exist
}
Cependant, depuis l'ajout de errors.Is
dans Go 1.13 (sortie fin 2019), la nouvelle recommandation est d'utiliser errors.Is
:
file, err := os.OpenFile(...)
if errors.Is(err, os.ErrNotExist) {
// handle the case where the file doesn't exist
}
Il est généralement préférable d'éviter d'utiliser os.Stat
pour vérifier l'existence d'un fichier avant d'essayer d'en faire quelque chose, car il sera toujours possible que le fichier soit renommé, supprimé, etc. dans la fenêtre de temps avant que vous n'en fassiez quelque chose.
Cependant, si vous êtes d'accord avec cette réserve et que vous voulez vraiment, vraiment juste vérifier si un fichier existe sans ensuite faire quelque chose d'utile avec lui (à titre d'exemple artificiel, disons que vous écrivez un outil CLI inutile qui vous dit si oui ou non un fichier existe et ensuite se termine ¯\_(ツ)_/¯
), la méthode recommandée serait alors la suivante :
if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) {
// file does not exist
} else {
// file exists
}
2 votes
Je ne comprends pas vraiment. Au même moment vous dites qu'il n'y a pas de fonction standard et vous écrivez une réponse avec la fonction standard. Qu'est-ce qui m'échappe ? La question ne devrait-elle pas au moins être corrigée ?
0 votes
@dystroy - j'ai corrigé la question.
12 votes
Il vaut mieux éviter de demander l'existence de dossiers. En raison de la nature osée de la réponse, l'information obtenue ne dit en fait rien d'utile au-dessus du fichier qui existait au moment de la demande - mais qui n'existe peut-être plus. La méthode recommandée est d'ouvrir simplement un fichier et de vérifier si cela échoue ou non.
2 votes
@zzzz (je sais que cela fait des années, ce commentaire est pour les nouveaux lecteurs) Je suis d'accord dans le cas général. Mais mon application charge une bibliothèque tierce qui prend un chemin d'accès à un fichier comme données d'initialisation mais se plante si le fichier n'existe pas. Je pense qu'il s'agit d'un scénario valide pour vérifier si le fichier existe sans essayer de l'ouvrir afin de pouvoir signaler l'erreur sans plantage fatal, car mon code n'a pas besoin de lire le contenu du fichier ou d'écrire directement dans le fichier.