2009-09-16 20 views

Odpowiedz

9

Użyj access(2) w POSIX. W standardzie C najlepiej jest spróbować otworzyć go pod numerem fopen() i sprawdzić, czy mu się to uda.

If fopen() powraca NULL, można spróbować użyć errno odróżnić „Plik nie istnieje” (errno == ENOENT) i „Permission denied” (errno == EACCES) przypadki - niestety te dwa errno wartości są określone tylko przez POSIX jako dobrze.

(Nawet w POSIX, w większości przypadków najlepiej jest spróbować otworzyć plik, a następnie sprawdzić, dlaczego się nie udało, ponieważ użycie access() wprowadza oczywisty stan wyścigu).

+1

Chciałbym użyć fopen(), ale muszę być w stanie stwierdzić różnicę, czy plik nie jest czytelny i czy nie istnieje –

+0

Korzystanie z fopen będzie lepsze. Ponieważ dostęp jest podatny na ataki TOCTOU. (http://en.wikipedia.org/wiki/TOCTOU). Jeśli to w ogóle dotyczy twojego przypadku. –

+0

Nazwałbym ten brudny kod ... – Tobi

7

Użyj access() funkcję:

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

errno zostanie ustawiony na ENOENT jeśli plik nie istnieje, lub EACCES jeśli istnieje, ale nie jest dostępne dla bieżącego użytkownika. Aby uzyskać więcej kodów błędów, patrz the manual page.

8

Jestem fanem samodzielnego korzystania z stat().

+0

Pytający zapytał, jak odczytać uprawnienia pliku. Funkcja stat() zwraca uprawnienia do pliku. Funkcja fstat() zwraca uprawnienia do pliku, biorąc pod uwagę otwarty uchwyt pliku. – bearvarine