使用fcntl.h的open():如何不创建文件判断文件是否存在?
解决文件存在性判断问题(不创建文件)
你的核心问题是误用了O_CREAT | O_EXCL标志——这个组合的作用是强制创建新文件,若文件已存在则open调用失败,完全和你要的“判断文件是否存在”逻辑相反,还会在文件不存在时自动创建它,导致后续误判。
要实现不创建文件就判断存在性,只需改用只读模式打开文件,去掉所有创建类的标志:
int fd; // 以只读方式尝试打开文件,不创建新文件 fd = open(path, O_RDONLY); if (fd == -1) { free(path); Error("File Not Found!"); } // 后续可通过fd读取文件内容,操作完成后记得调用close(fd);
补充说明:
O_RDONLY是<fcntl.h>中定义的标准标志,仅请求打开文件进行读取操作,如果文件不存在,open会直接返回-1,不会生成任何新文件。- 如果需要更严谨的错误区分(比如区分“文件不存在”和“权限不足”等其他错误),可以结合
errno判断(需包含<errno.h>,CentOS环境默认支持):
#include <errno.h> int fd; fd = open(path, O_RDONLY); if (fd == -1) { free(path); if (errno == ENOENT) { Error("File Not Found!"); } else { Error("Failed to open file: Permission denied or other error!"); } }
内容的提问来源于stack exchange,提问作者eladgl
相关产品推荐
相关产品推荐

