Existe-t-il un meilleur moyen que d’essayer simplement d’ouvrir le fichier ?
Réponses
Trop de publicités?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.
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 */
}
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).
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.