La bibliothèque standard de Go n'a pas de fonction destinée uniquement à vérifier si un fichier existe ou non (comme Python os.path.exists
). Quelle est la façon idiomatique de le faire?
file
go
standard-library
Sridhar Ratnakumar
la source
la source
Réponses:
Pour vérifier si un fichier n'existe pas, équivalent à Python
if not os.path.exists(filename)
:Pour vérifier si un fichier existe, équivalent à Python
if os.path.exists(filename)
:Modifié: selon les commentaires récents
la source
NOTEXIST
, par exemple, s'il/etc/bashrc
existe, le/etc/bashrc/foobar
retourneENOTDIR
!os.IsNotExist(err)
. Il est possible que le fichier existe maisos.Stat
échoue pour d'autres raisons (par exemple, autorisation, disque défaillant). L'utilisationerr == nil
comme condition catégorise de manière incorrecte ces échecs comme «le fichier n'existe pas».Réponse de Caleb Spare publiée dans la liste de diffusion des gonuts .
Tiré de: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
la source
Vous devez utiliser les fonctions
os.Stat()
etos.IsNotExist()
comme dans l'exemple suivant:L'exemple est extrait d' ici .
la source
L' exemple de user11617 est incorrect; il signalera que le fichier existe même dans les cas où il n'existe pas, mais il y a eu une erreur d'une autre sorte.
La signature doit être Exists (chaîne) (bool, erreur). Et puis, en l'occurrence, les sites d'appel ne sont pas meilleurs.
Le code qu'il a écrit serait mieux:
Mais je suggère ceci à la place:
la source
err != nil
au lieu deerr == nil
? S'il y a une erreur, alors le fichier n'existe probablement pas?Ce que d'autres réponses ont manqué, c'est que le chemin donné à la fonction pourrait en fait être un répertoire. La fonction suivante s'assure que le chemin est vraiment un fichier.
Une autre chose à souligner: ce code peut toujours conduire à une condition de concurrence critique, où un autre thread ou processus supprime ou crée le fichier spécifié, tandis que la fonction fileExists est en cours d'exécution.
Si cela vous inquiète, utilisez un verrou dans vos threads, sérialisez l'accès à cette fonction ou utilisez un sémaphore interprocessus si plusieurs applications sont impliquées. Si d'autres applications sont impliquées, hors de votre contrôle, vous n'avez pas de chance, je suppose.
la source
la source
L'exemple de fonction:
la source
Examinons d'abord quelques aspects, à la fois la fonction fournie par le
os
package degolang
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 plates-formes.Donc, fondamentalement, si
os.Stat
cette fonction ne donne aucune erreur, cela signifie que le fichier existe, si c'est le cas, vous devez vérifier de quel type d'erreur il s'agit, voici l'utilisation de ces deux fonctionsos.IsNotExist
etos.IsExist
.Cela peut être compris comme l'
Stat
erreur de lancement de fichier car elle n'existe pas ou est-ce une erreur de lancement car elle existe et qu'il y a un problème avec elle.Le paramètre pris par ces fonctions est de type
error
, bien que vous puissiez y passernil
, mais cela n'aurait aucun sens.Cela souligne également le fait que
IsExist is not same as !IsNotExist
ce sont deux choses différentes.Alors maintenant, si vous voulez savoir si un fichier donné existe, je préférerais que la meilleure façon soit:
la source
Comme mentionné dans d'autres réponses, il est possible de construire le comportement / les erreurs requis en utilisant différents drapeaux avec
os.OpenFile
. En fait,os.Create
c'est juste un raccourci sensé par défaut pour le faire:Vous devez combiner ces indicateurs vous-même pour obtenir le comportement qui vous intéresse:
Selon ce que vous choisissez, vous obtiendrez différentes erreurs.
Voici un exemple où je souhaite ouvrir un fichier pour l'écriture, mais je ne tronquerai un fichier existant que si l'utilisateur a dit que c'était OK:
la source
Meilleure façon de vérifier si le fichier existe:
la source