用c++获取系统临时目录所在磁盘剩余可用字节数需分平台:windows调用getdiskfreespaceex(提取temp_directory_path根名作驱动器),linux/macos调用statvfs(直接传路径)。须处理路径无效、符号链接、单位一致及瞬时性问题。

如何用 C++ 获取系统临时目录所在磁盘的剩余可用字节数
不能直接靠 std::filesystem::temp_directory_path() 拿到路径就完事——它只返回路径,不提供磁盘空间信息。必须先解析出该路径挂载在哪个卷(Windows)或文件系统(Linux/macOS),再调用对应平台的磁盘空间查询 API。
Windows 下:用 GetDiskFreeSpaceEx 获取临时目录所在驱动器的可用字节
Windows 的临时目录通常是 %TEMP% 或 %SystemRoot%Temp,路径形如 C:UsersXXXAppDataLocalTemp。关键点是提取盘符(如 "C:"),再传给 GetDiskFreeSpaceEx:
-
std::filesystem::temp_directory_path()返回的是完整路径,需用.root_name()提取盘符(注意返回的是std::filesystem::path,要转成std::wstring供 Win32 API 使用) -
GetDiskFreeSpaceEx第三个参数(lpFreeBytesAvailable)返回的是“非特权用户可用字节数”,通常就是你要的“默认临时目录实际可用空间” - 如果临时路径是符号链接或网络路径(如
\servershare),root_name()可能为空,此时应 fallback 到GetCurrentDirectory所在卷,或显式检查GetDriveType
示例片段(需包含 <filesystem></filesystem>, <windows.h></windows.h>):
auto temp = std::filesystem::temp_directory_path();
std::wstring root = temp.root_name().wstring();
if (root.empty()) root = L"C:"; // fallback
ULARGE_INTEGER free;
if (GetDiskFreeSpaceEx(root.c_str(), nullptr, nullptr, &free)) {
uint64_t bytes = free.QuadPart; // 这就是可用字节数
}
Linux/macOS 下:用 statvfs 获取临时目录所在文件系统的可用块数
POSIX 系统没有“盘符”概念,但 statvfs 能根据任意路径查其所在挂载点的磁盘统计信息。临时目录路径(如 /tmp 或 $XDG_RUNTIME_DIR)可能跨文件系统,所以必须对路径本身调用 statvfs,而不是对父目录或根目录:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
statvfs返回的f_bavail * f_frsize是“非特权用户可用块数 × 块大小”,比f_bfree更准确(后者是 root 可用) -
std::filesystem::temp_directory_path()在 Linux 上可能返回/tmp,但某些发行版或容器环境会设为/run/user/1000—— 必须真实调用statvfs,不能硬编码路径 - 若
statvfs失败(如路径不存在、权限不足),应 fallback 到getenv("TMPDIR")或"/tmp"再试一次
示例片段(需包含 <sys></sys>):
auto temp = std::filesystem::temp_directory_path();
struct statvfs sv;
if (statvfs(temp.c_str(), &sv) == 0) {
uint64_t bytes = static_cast<uint64_t>(sv.f_bavail) * sv.f_frsize;
}</uint64_t>
跨平台封装时最容易踩的坑
别写一个函数叫 get_temp_disk_free_bytes() 就以为万事大吉。实际调用中容易忽略三点:
- 路径有效性:
std::filesystem::temp_directory_path()可能抛std::filesystem::filesystem_error(比如权限不足读取$HOME),必须 try-catch - 符号链接穿透:Linux 下
/tmp可能是 symlink 到/dev/shm,statvfs会自动解析,但 Windows 的GetDiskFreeSpaceEx对 UNC 路径不支持,需提前用GetFinalPathNameByHandle展开 - 单位混淆:Windows 的
ULARGE_INTEGER和 POSIX 的unsigned long都是 64 位,但 C++ 中直接存成uint64_t最安全;别用size_t(在 32 位平台可能溢出)
临时目录位置本身就不稳定,而磁盘空间是瞬时值——拿到数字后尽快使用,别缓存,也别假设它在整个程序生命周期内有效。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










