C++如何获取指定磁盘驱动器的总容量和剩余空间

星降

星降

2026-08-01

803人浏览

原创

windows下用getdiskfreespaceex获取磁盘剩余空间最可靠,需传入"c:"格式路径、检查返回值、用ularge_integer接收;linux/macos应使用statvfs并乘f_frsize计算字节数。

c++如何获取指定磁盘驱动器的总容量和剩余空间

Windows 下用 GetDiskFreeSpaceEx 获取驱动器空间信息

直接调用 Windows API 是最轻量、最可靠的方式,不需要额外依赖或权限提升。注意该函数要求传入的是带冒号和反斜杠的完整根路径(如 "C:\"),不是单个字母 "C:" —— 后者在某些系统配置下可能返回错误结果或触发访问拒绝。

常见错误现象:传入 "C:" 时返回 FALSElpFreeBytesAvailable 为 0;未检查返回值导致程序用到未初始化的数值;误把 lpTotalNumberOfBytes 当作可用空间。

  • 必须以字符串形式传入 "X:\ "(末尾双反斜杠是必需的,单反斜杠会被转义)
  • 三个输出参数都必须是非空指针,哪怕你只关心剩余空间,也要传入合法地址
  • 返回值为 FALSE 表示失败,此时应检查 GetLastError(),常见原因是路径不存在或权限不足(如访问网络驱动器失败)
ULARGE_INTEGER free, total, totalFree;
if (GetDiskFreeSpaceEx(L"C:\", &free, &total, &totalFree)) {
    std::wcout <h3>Linux/macOS 下用 <code>statvfs</code> 替代方案</h3><p>POSIX 系统没有“驱动器”概念,而是按挂载点(mount point)统计,比如 <code>/</code>、<code>/home</code>、<code>/mnt/data</code>。你需要先确认目标路径是否为独立文件系统根目录,否则得到的是上级挂载点的数据。</p><p>容易踩的坑:传入 <code>/dev/sda1</code> 这类设备路径会失败(<code>statvfs</code> 只接受挂载路径);忽略 <code>f_frsize</code> 直接用 <code>f_bsize</code> 计算会导致容量偏差;未处理符号链接导致实际查到的是其他挂载点。</p>
  • 使用 statvfs("/path", &buf),其中 /path 必须是已挂载的目录(如 "/""/mnt/mydisk"
  • 总容量 = buf.f_frsize * buf.f_blocks,剩余空间 = buf.f_frsize * buf.f_bavail(注意是 f_bavail,不是 f_bfree,后者不含 root 预留空间)
  • 跨平台代码中建议封装判断:Windows 走 GetDiskFreeSpaceEx,其他系统走 statvfs

C++ 跨平台封装时的类型与单位陷阱

两个 API 返回的都是字节数,但底层类型不同:ULARGE_INTEGER 是结构体,statvfs::f_blocksfsblkcnt_t(通常是 unsigned long long)。直接用 int64_t 接收可能截断,尤其在 32 位编译环境下。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载

更隐蔽的问题是单位换算:用户常期望显示 GB,但严格来说 1 GB = 1000³ 字节(SI 单位),而系统报告的是 1024³(GiB)。混用会导致数值差约 7% —— 比如显示 “100 GB” 实际只有 93 GiB。

  • 推荐统一用 uint64_t 存储原始字节数,避免有符号溢出
  • 显示时明确标注单位:用 "GiB" 表示 1024 进制,"GB" 表示 1000 进制,不要默认四舍五入到整数,保留一位小数更可信
  • Windows 下 GetDiskFreeSpaceExlpFreeBytesAvailable 返回的是当前用户可用空间(考虑配额),而 lpTotalNumberOfBytes 是物理总容量 —— 这点和 statvfsf_bavail/f_blocks 语义一致

不推荐用 std::filesystem::space 的真实原因

C++17 引入的 std::filesystem::space 看起来最简洁,但它在 Windows 上底层仍调用 GetDiskFreeSpaceEx,在 Linux 上调用 statvfs,看似跨平台,实则隐藏了关键限制:它无法指定驱动器字母(Windows)或挂载点(Linux),只能传入某个路径,然后向上追溯到最近的挂载根。这意味着 std::filesystem::space("C:\temp")std::filesystem::space("C:\") 结果相同,但 std::filesystem::space("D:\") 才真正对应 D 盘。

问题在于:如果传入的是软链接、子目录或未挂载路径,行为不可控;且无法获取总容量以外的元数据(如文件系统类型、块大小)。

  • 仅当你的目标路径确定位于独立挂载点(如 "C:\""/mnt/ssd")时才可安全使用
  • 不要用它探测 "Z:" 这类可能未连接的网络驱动器 —— 它会阻塞数秒甚至超时,而原生 API 可通过 SetErrorMode 或信号处理控制响应
  • 调试时发现 space 返回异常值,优先检查路径是否存在、是否可访问,而不是怀疑函数本身

驱动器空间查询看着简单,但路径格式、挂载语义、单位定义、错误传播这四点,任一出错都会让结果偏离预期。别图省事跳过错误检查,也别假设所有系统对“C:”的理解一致。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

832

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

753

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

243

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

242

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

224

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

461

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1107

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

858

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1022

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.1万人学习