2009-09-16 21 views

Respuesta

9

Use access(2) en POSIX. En el estándar C, lo mejor que puede hacer es tratar de abrirlo con fopen() y ver si tiene éxito.

If fopen() vuelve NULL, se puede tratar de utilizar errno de distinguir entre el "no existe archivo" (errno == ENOENT) y "Permiso denegado" (errno == EACCES) casos - pero desafortunadamente esos dos errno valores sólo se define por POSIX bien.

(Incluso en POSIX, en la mayoría de los casos lo mejor que puede hacer es tratar de abrir el archivo, y luego mirar por qué ha fallado, porque el uso de access() introduce una condición de carrera obvia).

+1

Usaría fopen(), pero tengo que ser capaz de distinguir si el archivo no es legible y si no existe –

+0

El uso de fopen será mejor. Porque el acceso es vulnerable a los ataques TOCTOU. (http://en.wikipedia.org/wiki/TOCTOU). Si eso es una preocupación en su caso en absoluto. –

+0

Llamaría a este código sucio ... – Tobi

7

utilizar la función access():

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

errno se establecerá en ENOENT si no existe el archivo o EACCES si existe pero no es accesible para el usuario actual. Consulte the manual page para obtener más códigos de error.

8

Soy un fan de usar stat(), yo mismo.

+0

El interrogador preguntó cómo leer los permisos de un archivo. La función stat() devuelve los permisos del archivo. La función fstat() devuelve los permisos del archivo dado su descriptor de archivo abierto. – bearvarine