542 votes

Ce qui ' s la meilleure façon de vérifier si un fichier existe en C ? (multi-plateforme)

Existe-t-il un meilleur moyen que d’essayer simplement d’ouvrir le fichier ?

747voto

Graeme Perrow Points 22249

Regardez en haut de la access() fonction. Vous pouvez remplacer votre fonction avec

if( access( fname, F_OK ) != -1 ) {
    // file exists
} else {
    // file doesn't exist
}

Vous pouvez également utiliser R_OK, W_OK, et X_OK à la place de F_OK pour vérifier la lecture de l'autorisation, la permission d'écriture et d'exécution d'autorisation (respectivement) plutôt que de l'existence, et vous pouvez vous OU l'un d'eux (c'est à dire vérifier à la fois lire et écrire l'autorisation à l'aide de R_OK|W_OK)

Mise à jour: Notez que sur Windows, vous ne pouvez pas utiliser W_OK fiable de test pour la permission d'écriture, puisque la fonction d'accès ne prend pas Dacl en compte. access( fname, W_OK ) peut retourner 0 (succès) parce que le fichier n'a pas l'attribut en lecture seule, mais vous n'avez pas l'autorisation d'écrire dans le fichier.

139voto

codebunny Points 1172

Utiliser stat comme ceci :

et l’appeler comme ceci :

97voto

Dan Points 18831

Habituellement, lorsque vous voulez vérifier si un fichier existe, c'est parce que vous voulez créer le fichier s'il ne le fait pas. Graeme Perrow la réponse est bonne si vous n'avez pas envie de créer ce fichier, mais il est vulnérable à une condition de course si vous n': un autre processus peut créer le fichier d'entre vous pour vérifier s'il existe, et vous en fait de l'ouvrir pour y écrire. (Ne riez pas... cela pourrait avoir de mauvaises répercussions sur la sécurité si le fichier a été créé un lien symbolique!)

Si vous voulez vérifier l'existence et de créer le fichier s'il se complique existe pas, automatiquement , de sorte qu'il n'y a pas de course condtiions, puis de les utiliser:

#include <fcntl.h>
#include <errno.h>

fd = open(pathname, O_CREAT | O_WRONLY);
if (fd < 0) {
  /* failure */
  if (errno == EEXIST) {
    /* the file already existed */
    ...
  }
} else {
  /* now you can use the file */
}

35voto

Mecki Points 35351

Oui. Utiliser stat(). Voir le lien.

Stat échoue si le fichier n'existe pas, sinon les plus susceptibles de réussir. Si elle n'existe pas, mais vous n'avez pas d'accès en lecture sur le répertoire où elle existe, elle échoue également, mais dans ce cas, aucune méthode n'aboutit pas (comment pouvez-vous contrôler le contenu d'un répertoire que vous ne pouvez pas voir en fonction de droits d'accès? Tout simplement, vous pouvez pas).

Oh, comme quelqu'un d'autre dit, vous pouvez également utiliser access(). Cependant, je préfère stat(), comme si le fichier existe, il sera immédiatement me faire un tas d'informations utiles (date de dernière mise à jour, quelle est sa taille, le propriétaire et/ou le groupe propriétaire du fichier, les autorisations d'accès, et ainsi de suite).

6voto

Shane MacLaughlin Points 12765

De l'aide de Visual C++, j'avais tendance à aller avec

/* ACCESS.C: This example uses _access to check the
 * file named "ACCESS.C" to see if it exists and if
 * writing is allowed.
 */

#include  <io.h>
#include  <stdio.h>
#include  <stdlib.h>

void main( void )
{
   /* Check for existence */
   if( (_access( "ACCESS.C", 0 )) != -1 )
   {
      printf( "File ACCESS.C exists\n" );
      /* Check for write permission */
      if( (_access( "ACCESS.C", 2 )) != -1 )
         printf( "File ACCESS.C has write permission\n" );
   }
}

Également intéressant de noter le mode des valeurs de _accesss(const char *path,int mode)

00 Existence seulement

02 la permission d'Écriture

04 autorisation de Lecture

06 Lire et à écrire l'autorisation

Comme votre fopen peut échouer dans les situations où le fichier existe mais n'a pas pu être ouvert sur demande.

Edit: Viens de lire Mecki post. stat() ressemble à un plus propre chemin à parcourir. Ho hum.

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