C++ 怎么获取文件大小 C++ filesystem file_size函数用法【C++17】
发布时间 - 2026-01-29 00:00:00 点击率:次std::filesystem::file_size是C++17获取文件大小的最直接方式,但需先用is_regular_file校验并捕获filesystem_error异常,且不适用于目录、权限不足或路径无效等场景。
file_size 函数能直接获取文件大小,但必须确保路径有效且有读取权限
std::filesystem::file_size 是 C++17 引入的最直接方式,它返回 std::uintmax_t 类型的字节数。但它不是“万能安全调用”——如果传入的是目录、符号链接未解引用、路径不存在或权限不足,会抛出 std::filesystem::filesystem_error 异常。
常见错误现象:terminate called after throwing an instance of 'std::filesystem::filesystem_error',往往因为没捕获异常或误把目录当文件传入。
- 使用前先用
std::filesystem::is_regular_file(path)检查是否为普通文件(跳过目录、socket、设备文件等) - 若路径是符号链接,默认按链接本身算(通常很小),如需目标文件大小,加
std::filesystem::symlink_option::follow - Windows *意路径分隔符兼容性:用正斜杠
/或双反斜杠\\,避免裸反斜杠引发编译错误
正确调用 file_size 的最小完整示例
以下代码包含必要头文件、命名空间、异常处理和基础校验:
#include#include int main() { std::filesystem::path p = "data.bin"; try { if (std::filesystem::is_regular_file(p)) { auto size = std::filesystem::file_size(p); std::cout << "Size: " << size << " bytes\n"; } else { std::cout << "Not a regular file\n"; } } catch (const std::filesystem::filesystem_error& ex) { std::cerr << "Filesystem error: " << ex.what() << '\n'; } }
注意:MSVC 19.20+、GCC 8.1+、Clang 7.0+ 才完整支持 std::filesy;GCC 需链接 
-lstdc++fs,Clang 同样需要该链接选项。
替代方案:stat 系统调用(跨 C++ 标准,但平台相关)
如果项目不能用 C++17,或需更底层控制(比如区分逻辑大小与磁盘占用),可用 POSIX stat 或 Windows GetFileSizeEx。但这就失去可移植性,且要手动处理结构体字段。
POSIX 示例关键点:
- 包含
,调用stat(path.c_str(), &sb) - 检查返回值是否为 0(失败返回 -1),再读
sb.st_size -
st_size对普通文件是字节数,对 FIFO/设备可能为 0 或无意义
Windows 示例关键点:
- 包含
,用GetFileAttributes先确认是文件(非目录) - 用
CreateFile+GetFileSizeEx,注意 HANDLE 必须带GENERIC_READ权限 - 返回值是
LARGE_INTEGER,需组合LowPart/HighPart
容易被忽略的细节:硬链接、稀疏文件、挂载点
file_size 返回的是文件的逻辑大小(即 ls -l 显示的 size),不是磁盘实际占用(du)。这对稀疏文件(如某些数据库快照、虚拟机镜像)差异极大——逻辑大小可能是 GB 级,实际占用只有几 MB。
硬链接不影响 file_size 结果,所有链接指向同一 inode,返回相同值;但若路径跨挂载点(比如通过 bind mount 或网络文件系统),file_size 仍能工作,前提是底层 OS 支持并已正确挂载。
真正棘手的是只读文件系统或 NFS 超时场景:异常类型仍是 filesystem_error,但错误码可能是 std::errc::operation_not_supported 或 std::errc::timed_out,需针对性判断而非一概吞掉异常。
# node
# windows
# 字节
# 虚拟机
# ai
# c++
# ios
# win
# stream
# 编译错误
# 命名空间
# Filesystem
# 结构体
# 数据库
# 的是
# 先用
# 文件系统
# 返回值
# 这就
# 仍是
# 不存在
# 这对
# 镜像
# 不能用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信推文制作网站有哪些,怎么做微信推文,急?
如何用PHP快速搭建高效网站?分步指南
Laravel怎么调用外部API_Laravel Http Client客户端使用
网站制作免费,什么网站能看正片电影?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
如何在 Pandas 中基于一列条件计算另一列的分组均值
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何在阿里云部署织梦网站?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
JS碰撞运动实现方法详解
大同网页,大同瑞慈医院官网?
python中快速进行多个字符替换的方法小结
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
高端云建站费用究竟需要多少预算?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel如何使用Livewire构建动态组件?(入门代码)
Laravel怎么在Controller之外的地方验证数据
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
,交易猫的商品怎么发布到网站上去?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何快速搭建支持数据库操作的智能建站平台?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何用免费手机建站系统零基础打造专业网站?
简历在线制作网站免费版,如何创建个人简历?
如何快速辨别茅台真假?关键步骤解析
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何在云指建站中生成FTP站点?
奇安信“盘古石”团队突破 iOS 26.1 提权
北京网站制作公司哪家好一点,北京租房网站有哪些?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何在 React 中条件性地遍历数组并渲染元素
Laravel如何处理异常和错误?(Handler示例)
Laravel怎么上传文件_Laravel图片上传及存储配置
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
浅谈redis在项目中的应用
Laravel如何记录自定义日志?(Log频道配置)
Laravel如何使用Vite进行前端资源打包?(配置示例)
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Swift中swift中的switch 语句
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何在Ubuntu系统下快速搭建WordPress个人网站?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置

