2009-09-16 25 views

Trả lời

9

Sử dụng access(2) trong POSIX. Trong tiêu chuẩn C, tốt nhất bạn có thể làm là cố gắng để mở nó với fopen() và xem nếu nó thành công.

Nếu fopen() lợi nhuận NULL, bạn có thể thử sử dụng errno để phân biệt giữa "File không tồn tại" (errno == ENOENT) và "Permission denied" (errno == EACCES) Các trường hợp - nhưng tiếc là hai errno giá trị chỉ được định nghĩa bởi POSIX như tốt.

(Ngay cả trên POSIX, trong hầu hết các trường hợp, điều tốt nhất cần làm là cố gắng mở tệp, sau đó xem tại sao nó không thành công, vì sử dụng access() giới thiệu một điều kiện rõ ràng).

+1

Tôi sẽ sử dụng fopen(), nhưng tôi cần để có thể cho biết sự khác biệt cho dù các tập tin isnt có thể đọc được và cho dù nó không tồn tại –

+0

Sử dụng fopen sẽ tốt hơn. Vì truy cập dễ bị tấn công TOCTOU. (http://en.wikipedia.org/wiki/TOCTOU). Nếu đó là một mối quan tâm trong trường hợp của bạn cả. –

+0

Tôi sẽ gọi mã bẩn này ... – Tobi

7

Sử dụng access() chức năng:

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

errno sẽ được thiết lập để ENOENT nếu tập tin không tồn tại, hoặc EACCES nếu nó tồn tại nhưng không thể truy cập cho người dùng hiện tại. Xem the manual page để biết thêm các mã lỗi.

8

Tôi là người hâm mộ sử dụng số stat().

+0

Người hỏi đã hỏi cách đọc quyền của tệp. Hàm stat() trả về các quyền của tệp. Hàm fstat() trả về các quyền của tập tin cho phép xử lý tệp đã mở của nó. – bearvarine