2009-09-16 12 views

Répondre

9

Utilisez access(2) dans POSIX. En Standard C, le mieux que vous pouvez faire est d'essayer de l'ouvrir avec fopen() et de voir si cela réussit.

Si fopen() retours NULL, vous pouvez essayer d'utiliser errno de faire la distinction entre le « fichier n'existe pas » (errno == ENOENT) et « Autorisation refusée » (errno == EACCES) cas - mais malheureusement, ces deux errno valeurs ne sont définies par POSIX bien.

(Même sur POSIX, dans la plupart des cas, la meilleure chose à faire est d'essayer d'ouvrir le fichier, puis regardez pourquoi il a échoué, car l'utilisation access() introduit une condition de concurrence évidente).

+1

J'utiliserais fopen(), mais je dois être capable de dire la différence si le fichier n'est pas lisible et s'il n'existe pas –

+0

L'utilisation de fopen sera meilleure. Parce que l'accès est vulnérable aux attaques TOCTOU. (http://en.wikipedia.org/wiki/TOCTOU). Si c'est une préoccupation dans votre cas. –

+0

Je appellerais ce code sale ... – Tobi

7

Utilisez la fonction access():

if (access(pathname, R_OK) == 0) 
{ 
    /* It's readable by the current user. */ 
} 

errno sera réglé sur ENOENT si le fichier n'existe pas, ou EACCES si elle existe, mais n'est pas accessible à l'utilisateur actuel. Voir the manual page pour plus de codes d'erreur.

8

Je suis un fan d'utiliser stat(), moi-même.

+0

Le questionneur a demandé comment lire les autorisations d'un fichier. La fonction stat() renvoie les autorisations du fichier. La fonction fstat() renvoie les permissions du fichier compte tenu de son handle de fichier ouvert. – bearvarine

Questions connexes