C++中获取文件系统配额与块大小需调用系统接口:POSIX平台用statvfs()或statfs(),Windows用GetDiskFreeSpaceEx()和GetVolumeInformation(),跨平台建议条件编译封装统一接口。

如果您需要在 C++ 程序中获取文件系统的底层存储配额(如总空间、可用空间、inode 数量等)以及基本块大小(block size)、扇区大小(sector size)等信息,则需调用操作系统提供的系统级接口。以下是实现该目标的多种方法:
一、使用 statvfs() 系统调用(POSIX 兼容平台)
statvfs() 是 POSIX 标准定义的系统调用,用于获取挂载点的文件系统统计信息,包括总块数、可用块数、块大小、文件系统类型标识等,适用于 Linux、macOS 及多数类 Unix 系统。
1、包含必要头文件:#include
2、声明 struct statvfs 类型变量用于接收结果
立即学习“C++免费学习笔记(深入)”;
3、调用 statvfs("/path/to/mount/point", &buf) 获取指定路径所在文件系统的统计信息
4、从 buf.f_frsize 获取基本块大小(fundamental block size),buf.f_bsize 为推荐 I/O 块大小
5、计算总空间:buf.f_blocks * buf.f_frsize;可用空间:buf.f_bavail * buf.f_frsize
6、获取 inode 相关信息:buf.f_files(总 inode 数)、buf.f_favail(可用 inode 数)
二、使用 statfs() 系统调用(Linux 原生扩展)
statfs() 是 Linux 提供的更底层接口,返回 struct statfs 结构体,字段更贴近内核实际值,支持 ext4/xfs/btrfs 等主流文件系统,且可获取逻辑块大小、物理扇区大小等精细参数。
1、包含头文件:#include
2、声明 struct statfs buf 变量
3、调用 statfs("/path", &buf) 获取文件系统状态
4、提取 buf.f_bsize 获取文件系统块大小,buf.f_frsize 为最小分配单元大小(若存在)
5、通过 buf.f_type 获取文件系统类型编码(如 EXT4_SUPER_MAGIC、XFS_SUPER_MAGIC)
6、Linux 5.10+ 内核中,可通过 ioctl(fd, BLKSSZGET, §or_size) 配合 open("/dev/xxx") 获取物理扇区大小
三、使用 getmntent() + statvfs() 组合遍历挂载点
当需要枚举所有挂载点并分别查询其配额与块大小时,需先读取 /proc/mounts(Linux)或 /etc/mtab(传统 Unix),再对每个挂载点执行 statvfs() 查询,避免硬编码路径。
1、打开 /proc/mounts 文件:FILE* fp = setmntent("/proc/mounts", "r");
2、循环调用 getmntent(fp) 获取 struct mntent* 条目
3、过滤掉伪文件系统(如 proc、sysfs、cgroup)和网络文件系统(nfs、cifs)
4、对每个有效挂载点路径调用 statvfs() 并保存结果
5、关闭文件句柄:endmntent(fp)
四、Windows 平台使用 GetDiskFreeSpaceEx() 和 GetVolumeInformation()
在 Windows 上,C++ 程序需调用 Win32 API 获取卷级配额与簇大小信息,其中 GetDiskFreeSpaceEx() 返回字节级空间数据,GetVolumeInformation() 提供每簇字节数(lpBytesPerSector、lpBytesPerCluster)等关键参数。
1、包含头文件:#include
2、声明 ULARGE_INTEGER 类型变量用于接收总空间、可用空间、总自由空间
3、调用 GetDiskFreeSpaceEx(L"C:\", &free_bytes, &total_bytes, &total_free_bytes)
4、调用 GetVolumeInformation(L"C:\", nullptr, 0, &serial, &max_comp_len, &flags, vol_name_buf, MAX_PATH)
5、通过 GetDiskFreeSpace(L"C:\", §ors_per_cluster, &bytes_per_sector, &clusters_per_volume, &free_clusters) 获取簇与扇区尺寸
五、跨平台封装建议:条件编译 + 抽象结构体
为统一不同平台的行为,可定义结构体 FilesystemInfo 封装通用字段,并基于预处理器宏选择底层实现路径,确保接口一致、调用简洁。
1、定义结构体包含 total_bytes、available_bytes、block_size、sector_size、inode_total、inode_available 字段
2、在 Linux/macOS 下启用 __linux__ 或 __APPLE__ 宏分支,调用 statvfs()/statfs()
3、在 Windows 下启用 _WIN32 宏分支,调用 GetDiskFreeSpaceEx() 和 GetVolumeInformation()
4、提供统一函数接口:bool GetFilesystemInfo(const std::string& path, FilesystemInfo& out);
5、对无效路径或权限不足情况返回 false,并设置 errno 或 GetLastError() 值供调试


















