检测文件存在性与读取权限:代码问题排查及S_IRUSR校验正确性确认
代码问题排查:文件存在性与可读检查的逻辑错误
咱们直接拆解问题,你的这段代码里有个致命的返回值判断错误,不过关于S_IRUSR的写法倒是没问题,下面详细说:
核心问题分析
stat函数返回值判断完全写反了
stat函数的设计规则是:调用成功返回0,失败返回-1。你写的if (stat(file_path,&fileStat) > 0)相当于只有stat调用失败时才会进入判断逻辑,这和你想要的“文件存在且能被读取”的需求完全相反,这是最影响功能的bug。S_IRUSR的写法是正确的,但有前提
(fileStat.st_mode & S_IRUSR)这个写法没问题,它确实能准确判断当前用户是否拥有该文件的读权限。但要注意:如果stat调用失败,fileStat的内容是未定义的,直接访问fileStat.st_mode会触发未定义行为,所以必须先确保stat调用成功,再去检查权限。
修正后的代码
if (stat(file_path, &fileStat) == 0 && (fileStat.st_mode & S_IRUSR)) { puts("SUCCESS"); create_message(OK); }
额外优化建议
如果你的最终目的是要读取这个文件,其实更推荐用access(file_path, R_OK)直接判断,它会一次性检查文件是否存在且当前用户可读,不仅代码更简洁,还能避免stat之后文件状态被修改的竞态问题:
if (access(file_path, R_OK) == 0) { puts("SUCCESS"); create_message(OK); }
内容的提问来源于stack exchange,提问作者Darren Col
相关产品推荐
相关产品推荐

