不能,getdiskfreespaceex仅返回磁盘空间静态信息,不提供i/o速率;应使用wmi查询win32_perfformatteddata_perfdisk_physicaldisk类的diskreadbytespersec字段获取每秒读取字节数。

Windows下用 GetDiskFreeSpaceEx 能不能拿到每秒读取字节?
不能。GetDiskFreeSpaceEx 只返回剩余/总空间等静态信息,和I/O速率完全无关。想获取“每秒读取字节”,本质是采集磁盘I/O性能计数器,不是文件系统元数据。
Windows上真正可用的方案:WMI + Win32_PerfFormattedData_PerfDisk_PhysicalDisk
这是最稳定、无需管理员权限(多数情况下)、兼容Win7+的方案。关键字段是 DiskReadBytesPerSec,它已做单位换算,直接就是每秒字节数。
- 用
IWbemServices::ExecQuery查询该WMI类,Name为_Total表示所有物理磁盘汇总值 - 避免轮询太频繁(如
- 首次查询可能返回0,需连续两次调用(间隔1秒以上)再相减——但该类已是“格式化数据”,
DiskReadBytesPerSec是瞬时速率,直接取即可 - 若需单个磁盘(如C:),
Name字段对应C:或0 C:(取决于Windows版本),建议先枚举所有Name值确认
Linux下用 /proc/diskstats 手动计算
/proc/diskstats 不直接提供“每秒字节数”,需自己采样计算。第3列(read sectors)×512 = 读取字节数,两次读取差值除以时间差即为速率。
- 注意字段顺序:不同内核版本列数可能不同,优先按设备名匹配行,再取第3列(read sectors)和第4列(read ticks),而非硬编码索引
- sector大小固定为512字节,不要用
getconf PAGESIZE或其他值替代 - 采样间隔至少1秒,否则浮点除法易因整数截断导致结果为0
- 同一设备可能有多个条目(如
sda和sda1),sda是物理盘总计,sda1是分区,别混用
跨平台封装要注意的坑
没有标准C++ API能跨平台获取磁盘吞吐率。硬封装会掩盖差异,不如明确分路径:
- Windows走WMI(依赖
comsuppw.lib和CoInitialize),Linux走/proc/diskstats(需读文件权限,普通用户默认可读) - 别试图用
std::filesystem或第三方库(如Boost.IoStreams)替代——它们不暴露底层I/O计数器 - 返回值统一用
uint64_t表示B/s,避免float精度丢失或负值(计数器溢出时WMI会自动回绕,/proc/diskstats是无符号long long) - Linux下若容器环境(如Docker),
/proc/diskstats显示的是宿主机视图,无法隔离到容器磁盘限速值
实际部署时,WMI在Server Core或最小化安装系统中可能未启用;Linux下若挂载了ZFS/Btrfs等非ext系列文件系统,/proc/diskstats 依然有效——它统计的是块设备层,和上层文件系统无关。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











