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
相关产品推荐
相关产品推荐

