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

C++中stat函数始终返回-1致文件大小获取失败,求解决方案

解决stat函数始终返回-1无法获取文件大小的问题

我来帮你一步步排查并解决这个问题,stat返回-1通常是路径错误、权限不足或者特殊文件处理不当导致的,咱们逐个分析:

1. 最常见的原因:路径不完整

你调用stat(d_name, &buff)时,d_name大概率只是文件名(比如从readdir拿到的结果),而不是完整文件路径。举个例子:如果你遍历的目标目录是/home/user/my_files,readdir返回的d_name是test.txt,直接用stat("test.txt", ...)会在程序当前工作目录下找这个文件,而不是/home/user/my_files里的,自然找不到,返回-1。

解决方法:拼接完整路径

修改你的getSize函数,传入遍历的基础路径,和文件名拼接成完整路径后再调用stat:

long getSize(const char *base_dir, const char *d_name) {
    // 拼接完整路径,注意处理基础路径末尾是否有/的情况
    string full_path = string(base_dir);
    if (full_path.back() != '/') {
        full_path += "/";
    }
    full_path += d_name;

    struct stat buff {};
    int exists = stat(full_path.c_str(), &buff);
    long totalSize = 0;

    if (exists == -1) {
        // 打印具体错误信息,方便排查问题
        perror(("stat failed for: " + full_path).c_str());
    } else {
        totalSize = buff.st_size;
    }
    return totalSize;
}

2. 检查权限问题

如果路径没问题,但stat还是返回-1,那可能是运行程序的用户没有访问该文件或其父目录的权限。此时可以通过errno查看具体错误码:

  • EACCES:权限不足,需要确保当前用户有读该文件的权限
  • ENOENT:文件不存在(还是路径问题)
  • ELOOP:符号链接循环(如果是软链接的情况)

刚才的代码里已经加了perror,运行程序时就能看到具体错误提示,帮你快速定位。

3. 特殊文件处理:符号链接、设备文件等

如果d_name是符号链接,默认stat会跟随链接到目标文件,如果目标文件不存在或无权限,也会返回-1。如果你想获取符号链接本身的大小,改用lstat代替stat即可:

int exists = lstat(full_path.c_str(), &buff);

额外小提示

你的Entity结构体里modofied_at拼写有误,应该是modified_at,虽然你标注了等价,但修正拼写能避免后续代码里的不必要错误哦~

内容的提问来源于stack exchange,提问作者user9150719

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:18:28