2009-09-16 5 views

ответ

9

Используйте access(2) в POSIX. В стандарте C лучше всего попытаться открыть его с помощью fopen() и посмотреть, удастся ли ему это сделать.

Если fopen() возвращает NULL, вы можете попробовать использовать errno различать «Файл не существует» (errno == ENOENT) и «Отказано в доступе» (errno == EACCES) случаев - но, к сожалению, эти два errno значения определяются только POSIX, как Что ж.

(Даже в POSIX, в большинстве случаев лучше всего попытаться открыть файл, а затем посмотреть, почему это не удалось, потому что использование access() представляет собой очевидное состояние гонки).

+1

Я бы использовал fopen(), но мне нужно иметь возможность сказать разницу, является ли файл нечитаемым и не существует ли он –

+0

Использование fopen будет лучше. Поскольку доступ уязвим для атак TOCTOU. (Http://en.wikipedia.org/wiki/TOCTOU). Если это вообще проблема в вашем случае. –

+0

Я бы назвал этот грязный код ... – Tobi

7

Используйте access() функцию:

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

errno будет установлен в ENOENT, если файл не существует, или EACCES, если она существует, но не доступен для текущего пользователя. См. the manual page для получения дополнительных кодов ошибок.

8

Я фанат использования stat(), себя.

+0

Вопросник спросил, как читать разрешения файла. Функция stat() возвращает разрешения файла. Функция fstat() возвращает разрешения файла с учетом дескриптора открытого файла. – bearvarine

Смежные вопросы