需调用操作系统底层接口:一、statvfs()获取块大小与空间;二、getmntent()定位挂载点;三、quotactl()读取linux配额;四、xfs_io辅助xfs细节;五、windows用getdiskfreespaceex()和fsctl识别。

如果您需要在 C++ 程序中精确获取文件系统底层块大小以及用户或文件系统级别的存储配额信息,则需调用操作系统提供的底层接口。以下是实现该功能的多种方法:
一、使用 statvfs() 系统调用获取文件系统块大小与总/可用空间
statvfs() 是 POSIX 标准定义的系统调用,可返回挂载点的文件系统统计信息,包括基本块大小(f_frsize)、总块数(f_blocks)、可用块数(f_bavail)等字段,适用于 Linux、macOS 和大多数类 Unix 系统。
1、包含必要头文件:#include
2、声明 struct statvfs 类型变量用于接收结果
3、调用 statvfs("/path/to/mount/point", &buf),传入任意位于目标文件系统上的路径
4、从 buf.f_frsize 获取文件系统底层逻辑块大小(字节),该值通常为 4096 或 512
5、通过 buf.f_blocks * buf.f_frsize 计算总字节数,buf.f_bavail * buf.f_frsize 得到非特权用户可用字节数
二、使用 getmntent() 配合 statvfs() 定位指定挂载点的块参数
当程序无法预知目标路径所属挂载点时,需先遍历 /proc/mounts(Linux)或 getmntent() 接口枚举所有挂载项,匹配目标路径所在的文件系统设备或挂载路径,再对其执行 statvfs()。
1、打开 /etc/mtab 或使用 setmntent("/proc/mounts", "r") 获取挂载项列表
2、逐条读取 struct mntent,检查 mnt_dir 字段是否为待查询路径的祖先目录
3、对匹配的 mnt_dir 调用 statvfs(),避免因路径跨挂载点导致数据错误
4、使用 realpath() 对输入路径标准化,提升挂载点匹配准确率
5、注意:getmntent() 在部分 musl libc 环境下不可用,应检测 __GLIBC__ 宏并提供备用方案
三、使用 quotactl() 系统调用读取磁盘配额信息(Linux)
quotactl() 是 Linux 特有的系统调用,支持获取用户/组在 ext4/xfs 等启用配额的文件系统上的软硬限制及当前使用量,需 root 权限或 CAP_SYS_ADMIN 能力。
1、包含头文件:#include
2、构造 struct dqblk 变量用于接收配额数据
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
3、调用 quotactl(QCMD(Q_GETQUOTA, USRQUOTA), "/dev/sda1", uid, (caddr_t)&dq)
4、解析 dq.dqb_bhardlimit(块硬限制)、dq.dqb_bsoftlimit(块软限制)、dq.dqb_curspace(当前已用块数)
5、注意:必须确保目标文件系统已启用配额且已运行 quotaon,否则返回 ENOENT 或 ESRCH
四、使用 xfs_io 命令行工具 + popen() 辅助获取 XFS 特有块与配额细节
对于 XFS 文件系统,xfs_info 和 xfs_quota 提供比内核接口更详尽的底层参数,如 allocation group 大小、inode size、实时配额状态等,可通过子进程调用方式集成进 C++ 程序。
1、构建命令字符串:"xfs_info /mount/point 2>/dev/null | grep -E 'bsize|agcount|agsize'"
2、使用 popen() 执行并读取 stdout 输出流
3、解析 bsize= 后数值作为逻辑块大小,agsize= 后数值作为分配组大小(单位为块)
4、对配额执行 "xfs_quota -xc 'report -ubh' /mount/point" 获取用户级配额报告
5、注意:需校验 xfs_io 或 xfs_quota 是否存在于 PATH,缺失时应降级至 statvfs() 基础信息
五、Windows 平台使用 GetDiskFreeSpaceEx() 与 FSCTL_QUERY_FILE_SYSTEM_RECOGNITION
Windows 不提供直接等效于 statvfs() 的标准 API,但 GetDiskFreeSpaceEx() 可返回每扇区字节数(lpSectorsPerCluster × lpBytesPerSector)作为簇大小近似底层块粒度;FSCTL_QUERY_FILE_SYSTEM_RECOGNITION 可识别 NTFS/exFAT 等类型。
1、包含头文件:#include
2、调用 GetDiskFreeSpaceEx(L"C:\", &free, &total, &freeUser) 获取空间数据
3、调用 GetDiskFreeSpace(L"C:\", §orsPerCluster, &bytesPerSector, &freeClusters, &totalClusters)
4、计算簇大小 = sectorsPerCluster × bytesPerSector,该值即 Windows 下对应“块大小”的最小分配单元
5、使用 DeviceIoControl() 发送 FSCTL_QUERY_FILE_SYSTEM_RECOGNITION 控制码识别文件系统能力,判断是否支持配额(仅 NTFS 支持)
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










