c++怎么使用std::filesystem获取磁盘空间_c++ space_info信息解析【实战】


std::filesystem::space() 返回的 space_info 包含 capacity(总容量)、free(非特权用户空闲字节数)和 available(进程实际可写入字节数),其中 available ≤ free,因后者扣除 root 保留空间、配额及文件系统开销。

std::filesystem::space() 返回的 space_info 到底包含什么

它返回一个 std::filesystem::space_info 结构体,含三个 uintmax_t 成员:capacity(总字节数)、free(非特权用户可用空闲字节数)、available(当前进程实际可写入的字节数)。注意:free ≠ available——后者会扣除 root 保留空间、配额限制、甚至某些文件系统(如 ext4)的 reserved blocks。

调用 std::filesystem::space() 的正确姿势

必须传入一个**有效路径**(不一定是文件,目录也行),且该路径需位于目标文件系统根下;否则可能抛出 std::filesystem::filesystem_error。常见错误是传入空字符串、不存在路径或跨挂载点路径(比如在 Linux 上对 /proc/sys 调用)。

  • 推荐用 std::filesystem::temp_directory_path()std::filesystem::current_path() 作为安全起点
  • Windows 下路径如 "C:/" 可用,但注意结尾斜杠不能少("C:" 是相对路径,行为未定义)
  • Linux/macOS 下建议用 "/" 获取根文件系统,或 "/home" 查看 home 所在分区
#include 
#include 

int main() {
    try {
        auto si = std::filesystem::space("/"); // ← 关键:必须是挂载点路径
        std::cout << "Capacity: " << si.capacity << " bytes\n";
        std::cout << "Free:     " << si.free << " bytes\n";
        std::cout << "Available:" << si.available << " bytes\n";
    } catch (const std::filesystem::filesystem_error& e) {
        std::cerr << "Error: " << e.what() << "\n";
    }
}

为什么 available 比 free 小?哪些场景会放大这个差值

差值主要来自三类限制:root reserved space(ext4 默认保留 5%)、user quotas(磁盘配额)、file system overhead(如 XFS 的 AG 管理块)。在容器或 CI 环境中尤其明显——Docker overlay2 层、GitHub Actions 的 runner 磁盘常设配额,导致 available 远低于 free

  • 检查是否启用配额:quota -u $USER(Linux)或 repquota -a
  • 查看 ext4 保留比例:tune2fs -l /dev/sda1 | grep "Reserved block count"
  • 生产代码中判断磁盘是否“够用”,应始终用 available,而非 freecapacity

Windows 和 Linux 下 behavior 差异与兼容性注意点

Windows(NTFS)通常不区分 freeavailable,二者值相等;而 Linux(ext4/xfs/btrfs)严格区分。C++20 标准未强制要求实现差异,所以依赖 available == free 会出问题。

  • 编译时确保开启 C++20:-std=c++20(GCC/Clang)或 /std:c++20(MSVC)
  • MSVC 需链接 Shlwapi.lib(已默认包含),但 MinGW-w64 某些旧版本需手动加 -lshlwapi
  • 交叉编译或嵌入式环境(如 musl libc)可能未完全实现 std::filesystem,建议先 #ifdef __cpp_lib_filesystem 检查
实际用的时候,别只看 free —— 写日志、解压包、生成缓存前,务必用 available 做容量预检,否则在配额受限的服务器上容易 runtime fail。


# linux  # git  # docker  # windows  # github  # 字节  # mac  # ai  # c++  # ios  # macos  # 解压  # count  # Filesystem  # 字符串  # 结构体  # 文件系统  # 不存在  # 而非  # 只看  # 则在  # 如在  # 也行  # 三类  # 抛出  # 不能少 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】  php订单日志怎么在swoole写_php协程swoole写订单日志教程【教程】  Python对象生命周期管理_创建销毁解析【教程】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】  PHP cURL GET请求:正确设置请求头与身份认证的完整教程  如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】  Windows10如何更改盘符名称_Win10重命名硬盘分区卷标  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  如何使用Golang安装依赖库_管理模块和第三方包  Win11怎么设置右键刷新选项_Windows11显示更多选项技巧  如何使用Golang指针与接口结合_实现方法调用和动态类型  Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】  如何使用正则表达式批量替换重复的星号-短横模式为固定字符串  Win11怎么关闭透明效果_Windows11个性化颜色关闭透明  mac本地php环境如何开启curl_curl扩展启用与测试步骤详解【汇总】  Win11如何设置系统语言_Win11系统语言切换教程【攻略】  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  php转exe用什么工具打包快_高效打包软件推荐【汇总】  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  Bpmn 2.0的XML文件怎么画流程图  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】  Mac上的iMovie如何剪辑视频?(新手入门教程)  Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序  php删除数据怎么加限制_带where条件删除避免全删【指南】  如何解决Windows时间不准的问题?(自动同步设置)  Python字符串处理进阶_切片方法解析【指导】  php订单日志怎么按状态筛选_php筛选不同状态订单日志教程【教程】  Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值  Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】  C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】  Mac如何整理桌面文件_Mac使用堆栈功能一键整理  php8.4如何调用com组件_php8.4windows下com操作指南【教程】  Python lxml的etree和ElementTree有什么区别  php怎么下载安装后设置默认字符集_utf8配置步骤【详解】  c++中的Tag Dispatching是什么_c++利用标签分发优化函数重载【元编程】  Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置  Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】  Win11笔记本怎么看电池健康度_Win11电池报告生成命令【详解】  Python性能剖析高级教程_cProfileLineProfiler优化案例解析  如何使用Golang写入二进制文件_Golang io Write二进制写入示例  Linux如何安装JDK11_Linux环境变量配置与Java开发环境搭建【教程】  Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】  Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】 

 2025-12-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.