c++怎么获取文件大小_c++ stat函数获取长度【核心】-C++

最可靠方法是用stat(),需包含,跨平台统一用st_size字段并检查返回值和S_ISREG;避免ifstream::tellg()等不可靠方式。

直接用 stat() 最可靠,Windows 和 Linux 都支持,但要注意结构体字段名和头文件差异。

stat() 在不同平台的头文件和结构体字段

stat() 是 POSIX 标准函数,Linux/macOS 直接包含 即可;Windows 下需用 MinGW 或 MSVC 的 UCRT 版本(VS2015+),头文件同样是 ,但结构体字段名统一为 st_size —— 不要写成 st_length 或 size,那是错的。

  • Linux/macOS:定义在 ,struct stat 里用 st_size
  • Windows(MSVC/MinGW):同样用 ,st_size 有效,但 st_mode 判断文件类型时需用 _S_IFREG 而非 S_IFREG
  • 别混用 fstat()(需要已打开的 fd)或 stat64()(旧兼容接口),除非明确处理超大文件且编译器不默认启用 large file support

stat() 获取大小的最小安全调用模式

必须检查返回值,stat() 失败时不保证 st_size 有定义,直接读会得到垃圾值。常见失败原因包括路径不存在、权限不足、符号链接悬空等。

  • 始终判断 stat(path, &sb) == 0,否则跳过或报错
  • 建议加一层判断:if (S_ISREG(sb.st_mode)) 确保是普通文件,避免把目录、设备文件的 st_size 当作内容长度
  • 示例片段:
struct stat sb;
if (stat("data.bin", &sb) == 0 && S_ISREG(sb.st_mode)) {
    off_t size = sb.st_size; // 注意:off_t 是有符号类型,可能为负(极少见)
}

为什么不用 ifstream::tellg() 或 seekg(0, end)?

因为它们不可靠:文本模式下换行符转换会导致偏移失真;某些文件系统(如 NFS)或特殊文件(procfs、FIFO)不支持随机 seek;而且开销大——得真正打开、定位、再关闭。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » c++怎么获取文件大小_c++ stat函数获取长度【核心】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008963+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008963+
  • 本周更新: 0+
  • 最后更新: 2026-03-16