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

262voto

Mostafa Points 7468
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Modifié pour ajouter la gestion des erreurs.

5 votes

Cela ressemble à de la "programmation d'exception" pour moi. Existe-t-il une ressource qui justifie ce type de code comme un paradigme officiel de #golang ?

0 votes

@OlivierAmblet Désolé pour cette réponse tardive. Qu'entendez-vous par "ce genre de code" ? La vérification de err ou quoi ?

26 votes

@OlivierAmblet Il n'y a pas d'exception ici. Go utilise panic pour un objet de type "exception". Vous pouvez "attraper" avec un appel à recover . Le retour explicite d'un err comme deuxième valeur de retour est une technique de Go extrêmement courante et idiomatique. Voir : golang.org/doc/effective_go.html#errors

144voto

dystroy Points 145126

Vous pouvez utiliser ce :

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Voir : http://golang.org/pkg/os/#IsNotExist

6 votes

C'est mieux que la réponse acceptée, mais la clause else est-elle vraiment nécessaire ?

12 votes

@SergeyKoulikov Il peut y avoir d'autres erreurs, comme une erreur de permission.

0 votes

Pourquoi est-ce "mieux" que la réponse acceptée ?

39voto

Edward Wagner Points 399

Il s'agit plutôt d'une information générale, puisque j'ai cherché pendant quelques minutes en pensant que ma question pouvait faire l'objet d'une recherche rapide.

Comment vérifier si le chemin représente un répertoire existant en Go ?

C'est la réponse la plus populaire dans mes résultats de recherche, mais ici et ailleurs, les solutions ne fournissent qu'un contrôle d'existence. Pour vérifier si path représente un répertoire existant, j'ai découvert que je pouvais facilement :

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Une partie de mon problème était que je m'attendais path/filepath pour contenir la fonction isDir().

26voto

mattes Points 882

Pour plus de commodité, vous pouvez simplement écrire :

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
  // path/to/whatever does not exist
}

ou :

if _, err := os.Stat("/path/to/whatever"); err == nil {
  // path/to/whatever exists
}

22voto

Nikta Jn Points 106

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

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
    // path/to/whatever does not exist
}

if _, err := os.Stat("/path/to/whatever"); err == nil {
    // path/to/whatever exists
}

Sources :

0 votes

Si je vous disais "Un moyen simple de s'enrichir rapidement : mettre de l'argent en banque. retirer de l'argent de la banque", vous penseriez que je vous dis qu'il y a deux étapes en série plutôt que deux étapes alternatives. Le problème de cette réponse est que les lecteurs peuvent ne pas comprendre que vous proposez deux approches possibles différentes.

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