Có cách nào tốt hơn là cố gắng mở tập tin không?
int exists(const char *fname)
{
FILE *file;
if ((file = fopen(fname, "r")))
{
fclose(file);
return 1;
}
return 0;
}
fopen()
/ fclose()
là bạn có thể không mở được tệp để đọc ngay cả khi nó tồn tại. Ví dụ, /dev/kmem
tồn tại, nhưng hầu hết các quy trình không thể mở nó ngay cả để đọc. /etc/shadow
là một tập tin như vậy. Tất nhiên, cả hai stat()
và access()
dựa vào việc có thể truy cập vào thư mục chứa tệp; tất cả các cược sẽ tắt nếu bạn không thể làm điều đó (không có quyền thực thi trên thư mục chứa tệp).
if (file = fopen(fname, "r"))
sẽ đưa ra một cảnh báo. Sử dụng dấu ngoặc đơn xung quanh câu lệnh bên trong câu lệnh ifif ((file = fopen(fname, "r")))