c++怎么获取文件在物理磁盘上分配的簇大小与扇区数【详解】

千雪吖_8088

千雪吖_8088

2026-03-25

294人浏览

原创

GetDiskFreeSpace是Windows下获取簇大小最可靠方式,需传入驱动器根路径如"C:\",返回每簇扇区数和每扇区字节数以计算簇大小;Linux/macOS应使用statvfs获取f_frsize作为等效值。

c++怎么获取文件在物理磁盘上分配的簇大小与扇区数【详解】

Windows 下用 GetDiskFreeSpace 获取簇大小和扇区信息

直接调用系统 API 是最可靠的方式,GetDiskFreeSpace 能一次性拿到每簇字节数、每扇区字节数、每簇扇区数等关键参数。它不依赖文件路径,只关心驱动器根路径(比如 "C:\"),所以哪怕目标文件在深层目录,你也得先提取其所在卷的根路径。

常见错误是传入完整文件路径(如 "C:\data\file.txt")导致失败——这个函数根本不接受文件路径,只认驱动器根目录加反斜杠的格式。

  • 必须确保路径以 "X:\" 形式传入,末尾双反斜杠不能少
  • 返回值为 0 表示失败,此时应调用 GetLastError() 查具体原因(比如权限不足或路径无效)
  • 注意参数顺序:lpSectorsPerCluster、lpBytesPerSector、lpNumberOfFreeClusters、lpTotalNumberOfClusters,别把扇区数和簇大小搞混
DWORD sectorsPerCluster, bytesPerSector, freeClusters, totalClusters;
BOOL ok = GetDiskFreeSpace(L"C:\", &sectorsPerCluster, &bytesPerSector,
                           &freeClusters, &totalClusters);
if (!ok) { /* 处理错误 */ }
// 簇大小 = sectorsPerCluster * bytesPerSector

Linux/macOS 下用 statfs 或 statvfs 查块大小

POSIX 系统没有“簇”概念,但有逻辑块大小(f_bsize)和基础块大小(f_frsize),后者更接近 Windows 的“每簇字节数”。statvfs 是推荐接口,比老的 statfs 更具可移植性。

容易踩的坑是误以为 f_bsize 就是磁盘分配单位——其实它只是 I/O 优化建议值;真正决定文件存储粒度的是 f_frsize(fundamental filesystem block size)。很多工具(如 df -B1)默认显示的也是这个值。

  • 传入任意路径即可(支持文件或目录),函数自动定位到其所在挂载点
  • 如果路径跨挂载点(比如符号链接指向另一分区),statvfs 仍返回目标路径所在设备的信息
  • 注意:f_frsize 可能等于 f_bsize,也可能小得多(如 ext4 常见 4096 vs 512)
struct statvfs buf;
if (statvfs("/path/to/file", &buf) == 0) {
    size_t cluster_size = buf.f_frsize; // 实际分配单位
}

为什么不能用 std::filesystem::file_size 或 stat 查簇大小

std::filesystem::file_size 和 C 的 stat 系列函数只返回文件逻辑大小,完全不涉及底层存储布局。它们读的是 inode/mft 中记录的字节数,和磁盘上实际占了多少簇毫无关系。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

典型错误现象:一个 1 字节的文件,file_size 返回 1,但磁盘上可能占了 4096 字节(一整个簇)。想算出“真实占用”,你得先知道簇大小,再向上取整——而这一步,必须靠上面两个系统级 API 完成。

  • stat 的 st_blksize 是 I/O 缓冲建议值,不是分配单位
  • st_blocks * 512 是 POSIX 标准块数(512 字节/块),但实际分配仍按 f_frsize 对齐
  • C++20 的 std::filesystem 没有扩展接口获取存储对齐信息,别指望它

跨平台封装时要注意的兼容性细节

Windows 的簇大小是卷级属性,Linux/macOS 的 f_frsize 是文件系统级属性,两者语义基本对等,但行为边界不同:NTFS 卷可以有多个簇大小(压缩/稀疏文件例外),而 ext4/XFS 等通常全卷统一。

最常被忽略的一点:SSD 或某些虚拟化环境(如 WSL2)下,f_frsize 可能返回 4096,但底层 NAND 页大小是 8KB 或更大——用户空间看到的“簇”只是文件系统抽象层的单位,不是物理 NAND 页或 RAID 条带大小。

  • 不要试图用这些值推算 SSD 寿命或写放大,那需要 ioctl 或 vendor-specific 工具
  • 在容器或网络文件系统(NFS/SMB)上,statvfs 返回的是服务器端文件系统的 f_frsize,客户端无法感知本地磁盘特性
  • Windows 上若文件在 ReFS 卷,GetDiskFreeSpace 依然可用,但 ReFS 内部使用变长分配单元,API 返回的仍是对外暴露的固定簇大小

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

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3208

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5169

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3849

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

486

15

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3339

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2918

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1528

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2659

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3330

4

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习