J'utilise la fonction suivante pour vérifier que mes répertoires ne contiennent pas d'erreurs. C'est très similaire aux réponses précédentes, mais je pense que ne pas imbriquer if
rend le code plus clair. Il utilise go-homedir
de supprimer ~
à partir des chemins de répertoire et pkg/errors
pour renvoyer des messages d'erreur plus jolis, mais il serait facile de les supprimer si vous n'avez pas besoin de leur fonctionnalité.
// validateDirectory expands a directory and checks that it exists
// it returns the full path to the directory on success
// validateDirectory("~/foo") -> ("/home/bbkane/foo", nil)
func validateDirectory(dir string) (string, error) {
dirPath, err := homedir.Expand(dir)
if err != nil {
return "", errors.WithStack(err)
}
info, err := os.Stat(dirPath)
if os.IsNotExist(err) {
return "", errors.Wrapf(err, "Directory does not exist: %v\n", dirPath)
}
if err != nil {
return "", errors.Wrapf(err, "Directory error: %v\n", dirPath)
}
if !info.IsDir() {
return "", errors.Errorf("Directory is a file, not a directory: %#v\n", dirPath)
}
return dirPath, nil
}
De plus, pour répéter le commentaire de @Dave C, si la raison pour laquelle vous vérifiez l'existence d'un répertoire est d'y écrire un fichier, il est généralement préférable de simplement essayer de l'ouvrir et de traiter les erreurs par la suite :
// O_EXCL - used with O_CREATE, file must not exist
file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
if err != nil {
return errors.WithStack(err)
}
defer file.Close()
10 votes
Notez également que selon la façon dont vous allez utiliser ces informations, vous avez une condition de course. Tout ce que vous pouvez dire, c'est qu'il y a peu de temps, le fichier existait ou n'existait pas ; au moment où vous effectuez le test, le contraire peut être vrai. En général, il est préférable de vérifier pendant l'opération que vous avez l'intention d'effectuer (par exemple, ne vérifiez pas avant d'ouvrir un fichier existant ou de créer un nouveau fichier, mais vérifiez avant de créer un nouveau fichier).
f, err := os.Open(name)
of, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)
et ensuite vérifieros.IsNotExist(err)
).