news 2026/10/5 16:50:07

C++:获取文件大小(字节数)(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:获取文件大小(字节数)(附带源码)

一、项目背景详细介绍

在 C++ 实际工程开发中,**获取文件大小(字节数)**是一个极其基础、却又频繁出现的需求。

典型应用场景包括:

  • 文件拷贝前判断大小

  • 下载 / 上传进度计算

  • 判断文件是否为空

  • 限制文件最大尺寸

  • 内存预分配(一次性读文件)

  • 校验文件完整性

  • 日志、CSV、二进制文件处理

  • 断点续传与分块读写

虽然这是一个“看似简单”的问题,但在工程实践中,错误用法非常常见,例如:

  • 以文本模式读取导致大小不准确

  • 使用tellg()却忘记移动到文件末尾

  • 大文件下使用int发生溢出

  • 混淆“字符数”和“字节数”

因此,本项目将系统性讲解:

如何使用 C++ 标准库,安全、准确、跨平台地获取文件大小(字节数)

并给出工程中最推荐、最常用的实现方式。


二、项目需求详细介绍

2.1 功能性需求

  1. 输入文件路径

  2. 获取文件大小(单位:字节)

  3. 支持任意类型文件(文本 / 二进制)

  4. 支持大文件(> 4GB)

  5. 文件不存在时返回明确错误


2.2 非功能性需求

  • 仅使用 C++ 标准库

  • 不依赖第三方库

  • 不使用系统 API

  • 跨平台(Windows / Linux / macOS)

  • 代码清晰、注释完整

  • 教学与工程可复用


2.3 关键约束说明

⚠️ 本项目获取的是文件大小(字节数)
⚠️ 不是“字符数”
⚠️ 不受文件编码影响


三、相关技术详细介绍

3.1 字节数 vs 字符数

  • 字节数(File Size)
    文件在磁盘上占用的真实大小

  • 字符数(Character Count)
    与编码相关(UTF-8 / UTF-16 / GBK)

示例:

内容编码字节数
ABCASCII3
中文UTF-86
中文UTF-164

➡️本项目只关心字节数


3.2 C++ 获取文件大小的几种方式对比

方法是否推荐说明
逐字节读取❌性能差
ifstream+tellg()✅常用、可靠
seekg()+tellg()✅工程推荐
<filesystem>⚠️C++17 才支持

⚠️ 为了与你前面系列代码风格统一,本项目采用文件流方式。


3.3seekg与tellg原理

  • seekg(pos):移动读指针

  • tellg():返回当前读指针位置(字节偏移)

文件末尾位置 = 文件大小(字节)


四、实现思路详细介绍

整体实现流程如下:

  1. 以二进制模式打开文件

  2. 将读指针移动到文件末尾

  3. 使用tellg()获取当前位置

  4. 返回该值作为文件大小

  5. 恢复或关闭文件

该方案具有以下优点:

  • 不读取文件内容

  • 时间复杂度 O(1)

  • 内存占用极低

  • 支持超大文件


五、完整实现代码

/******************************************************** * 文件名:get_file_size.cpp * 功能:使用 C++ 文件流获取文件大小(字节数) * 说明: * 1. 使用 ifstream + seekg + tellg * 2. 二进制方式,不受编码影响 * 3. 支持任意类型文件与大文件 ********************************************************/ #include <iostream> #include <fstream> #include <string> /** * @brief 获取文件大小(字节数) * @param fileName 文件路径 * @return 文件大小(字节),失败返回 -1 */ long long getFileSize(const std::string& fileName) { // 以二进制方式打开文件 std::ifstream ifs(fileName, std::ios::binary); if (!ifs.is_open()) { return -1; } // 将读指针移动到文件末尾 ifs.seekg(0, std::ios::end); // 获取当前位置(即文件大小) std::streampos fileSize = ifs.tellg(); // 关闭文件 ifs.close(); // tellg() 返回的是 streampos,这里转换为 long long return static_cast<long long>(fileSize); } int main() { std::string fileName = "test.bin"; long long size = getFileSize(fileName); if (size < 0) { std::cout << "无法获取文件大小,文件可能不存在。" << std::endl; } else { std::cout << "文件:" << fileName << std::endl; std::cout << "文件大小:" << size << " 字节" << std::endl; } return 0; }

六、代码详细解读(仅解读方法作用)

6.1getFileSize

  • 以二进制方式打开文件

  • 使用seekg(0, end)移动到文件末尾

  • 使用tellg()获取字节偏移

  • 返回文件大小

  • 文件无法打开时返回-1


6.2main函数

  • 指定待检测文件

  • 调用文件大小获取函数

  • 输出文件大小结果


七、项目详细总结

通过本项目,你已经系统掌握:

  • 文件大小与字符数的本质区别

  • 为什么必须使用二进制模式

  • seekg/tellg的正确工程用法

  • 如何安全支持大文件

  • 一个可复用的文件大小获取函数

该实现方案:

  • 高效

  • 稳定

  • 跨平台

  • 工程适用性极强


八、项目常见问题及解答

Q1:文本模式和二进制模式结果一样吗?

不一定。
Windows 下文本模式可能发生换行符转换。


Q2:为什么不用int返回大小?

int可能溢出(> 2GB)。
工程中必须使用long long。


Q3:对 UTF-8 / UTF-16 文件有影响吗?

没有。
返回的是字节数,与编码无关。


Q4:是否可以用于正在写入的文件?

可以,但获取的是当前时刻大小。


九、扩展方向与性能优化

9.1 使用 C++17<filesystem>获取文件大小

9.2 封装统一 FileUtils 工具类

9.3 获取目录下所有文件大小总和

9.4 结合文件拷贝显示进度条

9.5 大文件分块处理与断点续传

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 11:00:45

Zotero Style插件:让文献管理效率起飞的黑科技

Zotero Style插件&#xff1a;让文献管理效率起飞的黑科技 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地址: https:…

作者头像 李华
网站建设 2026/10/5 5:16:03

3步解锁教育资源管理工具:从零散下载到系统构建的高效解决方案

3步解锁教育资源管理工具&#xff1a;从零散下载到系统构建的高效解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 作为教育资源管理专家&#xff0c;我们…

作者头像 李华
网站建设 2026/10/6 0:00:19

PasteMD:解决学术写作中格式粘贴难题的效率工具

PasteMD&#xff1a;解决学术写作中格式粘贴难题的效率工具 【免费下载链接】PasteMD 一键将 Markdown 和网页 AI 对话&#xff08;ChatGPT/DeepSeek等&#xff09;完美粘贴到 Word、WPS 和 Excel 的效率工具 | One-click paste Markdown and AI responses (ChatGPT/DeepSeek) …

作者头像 李华
网站建设 2026/10/6 0:00:19

3步变身3D创作达人:ComfyUI工作流从入门到精通指南

3步变身3D创作达人&#xff1a;ComfyUI工作流从入门到精通指南 【免费下载链接】ComfyUI-Workflows-ZHO 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-Workflows-ZHO 你是否也曾对着复杂的3D建模软件望而却步&#xff1f;是否经历过花费数小时却只完成基…

作者头像 李华
网站建设 2026/10/6 0:00:19

革新性文献进度追踪工具:Ethereal Style for Zotero全攻略

革新性文献进度追踪工具&#xff1a;Ethereal Style for Zotero全攻略 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地…

作者头像 李华