2010-07-13 27 views
10

Có cách nào di chuyển (trên hệ thống POSIX) để xác định xem một bộ mô tả tập tin có thể tìm kiếm được không? Suy nghĩ của tôi là sử dụng lseek(fd, 0, SEEK_CUR); và kiểm tra xem giá trị trả về là -1, nhưng tôi không chắc chắn liệu điều này có thể mang lại âm tính giả hoặc dương tính giả hay không. Sử dụng fstat và đưa ra các giả định về loại tệp nào có thể tìm kiếm/không thể truy cập không giống như ý tưởng hay. Bất kỳ ý tưởng nào khác?Làm thế nào để xác định xem một bộ mô tả tập tin có thể tìm kiếm được không?

Trả lời

10

Phương thức lseek có vẻ hợp lý. Nó chắc chắn không thể gây ra một tiêu cực sai - nếu nó đã làm, một cái gì đó là nghiêm trọng sai với việc thực hiện. Ngoài ra, theo POSIX spec, nó được cho là thất bại nếu bộ mô tả là một đường ống, FIFO hoặc socket, vì vậy về mặt lý thuyết, bạn cũng không nên có các kết quả sai. Câu hỏi duy nhất còn lại là các hệ thống khác nhau tuân thủ các thông số kỹ thuật tốt như thế nào. Tuy nhiên, nó có vẻ giống như bất kỳ phương pháp khác, bất cứ điều gì họ có thể được, chắc chắn sẽ ít di động hơn này.

2

Bạn có thể sử dụng fstat(), sau đó macro S_ISREG trên trường chế độ của cấu trúc stat để kiểm tra xem đó có phải là tệp thông thường hay không; một tệp thông thường, per definiton, có thể tìm kiếm được trong khi tệp "không thường xuyên" (đặc biệt) có thể không có (tôi không biết nếu có các tệp đặc biệt nào cũng có thể tìm kiếm được).

Nhưng phải, kiểm tra giá trị trả lại của lseek() và errno == ESPIPE cũng sẽ hoạt động. Về nguyên tắc, the effect of lseek() on devices which are incapable of seeking is implementation-defined, vì vậy hãy cẩn thận của daemon mũi.

+3

Thiết bị chặn, chẳng hạn như ổ đĩa cứng, có thể tìm kiếm được. Có lẽ ngay cả các thiết bị nhân vật, nhưng tôi không chắc chắn. – Thomas

+1

một số thiết bị không thực sự có thể tìm kiếm sẽ không thất bại trong tìm kiếm (tại leas trên Linux, ai đó cố gắng tìm kiếm thất bại nhưng phát hiện ra các ứng dụng không gian người dùng phụ thuộc vào hành vi ...) – Spudd86

+0

True; một số trình điều khiển thiết bị ký tự đơn giản bỏ qua tìm kiếm() và âm thầm quay trở lại. –

Các vấn đề liên quan