You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检测文件存在性与读取权限:代码问题排查及S_IRUSR校验正确性确认

代码问题排查:文件存在性与可读检查的逻辑错误

咱们直接拆解问题,你的这段代码里有个致命的返回值判断错误,不过关于S_IRUSR的写法倒是没问题,下面详细说:

核心问题分析

  1. stat函数返回值判断完全写反了
    stat函数的设计规则是:调用成功返回0,失败返回-1。你写的if (stat(file_path,&fileStat) > 0)相当于只有stat调用失败时才会进入判断逻辑,这和你想要的“文件存在且能被读取”的需求完全相反,这是最影响功能的bug。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:02:55