173 votes

Comment vérifier si un fichier ou un répertoire existe ?

Je veux vérifier l'existence du fichier ./conf/app.ini dans mon code Go, mais je n'arrive pas à trouver un bon moyen de le faire.

Je sais qu'il existe une méthode de fichier en Java : public boolean exists() qui renvoie vrai si le fichier ou le répertoire existe.

Mais comment faire cela en Go ?

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) o f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode) et ensuite vérifier os.IsNotExist(err) ).

2voto

Ben Points 2658

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()

-5voto

Kabeer Shaikh Points 201

Il existe un moyen simple de vérifier si votre fichier existe ou non :

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

0 votes

Il s'agit d'un duplicata de la réponse de Denys Séguret.

0 votes

En plus d'être un doublon qui a dû être corrigé par l'éditeur, c'est aussi une erreur. Il ne gère jamais le cas où un fichier existe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X