最稳妥方式是先用std::filesystem::temp_directory_path()获取临时目录路径,再调用GetDiskFreeSpaceEx(Windows)或statvfs(Linux/macOS)查询其所在卷的可用空间,注意处理异常、路径有效性及单位精度。

Windows 下用 GetDiskFreeSpaceEx 获取临时目录所在卷的剩余空间
直接调用 GetDiskFreeSpaceEx 是最稳妥的方式,它返回的是真实可用字节数(考虑配额和权限),比 GetDiskFreeSpace 更准确。关键在于先拿到临时目录路径,再提取其所在驱动器根路径。
- 用
GetTempPath获取临时路径(如"C:\Users\xxx\AppData\Local\Temp\"),注意它末尾带反斜杠 - 用
PathStripToRoot(需#include <shlwapi.h>)或手动截取盘符(如取前 3 字符"C:\")得到卷根路径 - 传给
GetDiskFreeSpaceEx:三个参数分别接收总空闲、总可用、总容量(单位字节),传nullptr可跳过不需要的值 - 如果临时路径是 UNC 路径(如
"\\server\share\temp"),GetDiskFreeSpaceEx仍可工作,但需确保有网络访问权限
Linux/macOS 下通过 getconf 和 statvfs 获取 /tmp 所在文件系统的剩余空间
std::filesystem::temp_directory_path() 返回的路径(通常是 /tmp 或 /var/tmp)可能挂载在独立文件系统上,必须用 statvfs 查该路径所在挂载点,不能只查 /tmp 目录本身的父目录。
- 调用
statvfs传入std::filesystem::temp_directory_path().c_str(),结果存入struct statvfs - 真正反映“用户可用剩余空间”的是
f_bavail * f_frsize(而非f_bfree),因为f_bavail已扣除 root 保留块 -
getconf PAGESIZE和getconf PAGE_SIZE在不同系统行为不一致,不要依赖;f_frsize才是文件系统实际块大小 - 若
statvfs失败(如路径不存在或无权限),应 fallback 到/或记录错误,不能静默返回 0
跨平台封装时别忽略 std::filesystem::temp_directory_path 的异常与路径有效性
std::filesystem::temp_directory_path() 可能抛出 std::filesystem::filesystem_error(例如环境变量 TMP 指向无效路径),且返回路径未必真实存在或可访问——这直接影响后续 statvfs 或 GetDiskFreeSpaceEx 的成败。
- 务必用
try/catch包裹std::filesystem::temp_directory_path() - 调用前检查路径是否存在:
std::filesystem::exists(path),不存在则尝试父目录(如path.parent_path())或降级到"/tmp"(Linux/macOS)或"C:\Temp"(Windows) - Windows 下
GetTempPath返回路径长度上限为MAX_PATH(260),若启用了长路径支持,仍建议用std::filesystem::temp_directory_path()更可靠
单位换算和精度丢失风险要提前处理
所有 API 返回的都是字节数,但直接转 GB 容易因整数除法或浮点精度导致显示偏差(比如显示 “1.99 GB” 实际是 2 GB 整)。尤其在磁盘接近满时,小数位误差可能掩盖关键余量。
立即学习“C++免费学习笔记(深入)”;
- 用
uint64_t接收所有空间值,避免unsigned long在 32 位系统上溢出 - 换算时优先用整数运算:剩余空间 ≥ 1TiB 时用
bytes / (1024ULL * 1024 * 1024 * 1024),避免 double 引入舍入误差 - 展示用
std::format(C++20)或snprintf控制小数位数,但底层判断逻辑(如“是否低于 500MB”)必须用原始字节数比较
临时目录所在卷的挂载点可能动态变化(比如 Docker 容器里 /tmp 绑定挂载自内存 tmpfs),每次获取都应重新查询,缓存结果容易误判。


















