2009-09-16 15 views

risposta

9

Utilizzare access(2) in POSIX. In Standard C, il meglio che puoi fare è provare ad aprirlo con fopen() e vedere se ha successo.

If fopen() rendimenti NULL, si può provare a utilizzare errno distinguere tra il "File non esiste" (errno == ENOENT) e "Permesso negato" (errno == EACCES) casi - ma purtroppo questi due errno valori sono definiti solo da POSIX bene.

(Anche su POSIX, nella maggior parte dei casi la cosa migliore da fare è provare ad aprire il file, quindi controllare perché non è riuscito, perché l'utilizzo di access() introduce una condizione di competizione evidente).

+1

Vorrei usare fopen(), ma devo essere in grado di capire se il file non è leggibile e se non esiste –

+0

Usare fopen sarà migliore. Perché l'accesso è vulnerabile agli attacchi TOCTOU. (Http://en.wikipedia.org/wiki/TOCTOU). Se questo è un problema nel tuo caso. –

+0

Chiamerei questo codice sporco ... – Tobi

7

utilizzare la funzione access():

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

errno sarà impostato ENOENT se il file non esiste, o se esiste EACCES ma non è accessibile per l'utente corrente. Vedi the manual page per altri codici di errore.

8

Sono un fan dell'uso di stat(), me stesso.

+0

L'interrogante ha chiesto come leggere le autorizzazioni di un file. La funzione stat() restituisce le autorizzazioni del file. La funzione fstat() restituisce le autorizzazioni del file data l'handle del file aperto. – bearvarine

Problemi correlati