news 2026/3/6 6:02:49

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.3seekgtellg原理

  • 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/3/3 5:43:00

5大平台高效采集:多媒体数据采集全攻略

5大平台高效采集&#xff1a;多媒体数据采集全攻略 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new 在数字化时代&#xff0c;多媒体数据已成为内容创作、市场分析和学术研究的核心资源。然而&#xff0c;跨平台…

作者头像 李华
网站建设 2026/2/27 17:58:04

数字管家Czkawka:让你的磁盘空间不再“打嗝“

数字管家Czkawka&#xff1a;让你的磁盘空间不再"打嗝" 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: https://git…

作者头像 李华
网站建设 2026/3/4 3:24:42

fft npainting lama支持透明通道吗?Alpha层处理实测

fft npainting lama支持透明通道吗&#xff1f;Alpha层处理实测 1. 引言&#xff1a;图像修复中的透明通道需求 在图像编辑和内容创作中&#xff0c;我们经常遇到需要保留或处理透明背景的场景。比如设计Logo、制作贴纸、UI元素抠图等&#xff0c;这些工作都依赖PNG格式的Alp…

作者头像 李华
网站建设 2026/3/6 1:43:30

开箱即用!BERT镜像让中文文本处理效率提升3倍

开箱即用&#xff01;BERT镜像让中文文本处理效率提升3倍 1. 为什么你需要一个高效的中文语义理解工具&#xff1f; 你有没有遇到过这样的场景&#xff1a;写文章时卡在一个成语上&#xff0c;怎么都想不起下一句&#xff1f;或者审校文案时发现句子不通顺&#xff0c;但又说…

作者头像 李华
网站建设 2026/2/26 23:18:12

突破3大瓶颈:如何用分布式架构实现万级加密货币实时预测?

突破3大瓶颈&#xff1a;如何用分布式架构实现万级加密货币实时预测&#xff1f; 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 当你的量化系统在加密货币…

作者头像 李华
网站建设 2026/3/4 1:23:59

Cute_Animal_For_Kids_Qwen_Image灰度发布:渐进式上线方案

Cute_Animal_For_Kids_Qwen_Image灰度发布&#xff1a;渐进式上线方案 你有没有试过&#xff0c;孩子指着绘本里的一只小狐狸说“我也想要一只会跳舞的粉鼻子狐狸”&#xff0c;然后你翻遍所有绘图工具却找不到合适的风格&#xff1f;或者美术老师想为低龄班准备一批安全、温暖…

作者头像 李华