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

stem;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_supportedstd::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与依赖倒置