应使用C++17的std::filesystem::temp_directory_path()获取跨平台临时目录,再用std::filesystem::space()获取其所在挂载点的可用字节数,二者均自动处理环境变量、路径解析与权限边界。

如何用 C++ 获取系统默认临时目录路径
Windows 和 Linux/macOS 的临时目录获取方式不同,不能硬编码 /tmp 或 C:Temp —— 这些路径可能不存在、不可写,或被策略重定向。C++ 标准库直到 C++17 才通过 std::filesystem::temp_directory_path() 提供跨平台接口,它会读取环境变量(如 TMP、TEMP、TMPDIR), fallback 到系统约定路径。
实操建议:
- 必须包含
<filesystem>头,并链接-lstdc++fs(GCC)或启用 /std:c++17(MSVC) - 调用前检查异常:如果所有环境变量为空且系统路径不可访问,
std::filesystem::temp_directory_path()会抛出std::filesystem::filesystem_error - 不要用
GetTempPath(Windows API)或tmpnam(已弃用)替代 —— 前者只返回字符串,后者不保证路径存在且线程不安全
如何获取该目录所在磁盘的剩余空间(字节数)
std::filesystem::space() 是唯一标准、跨平台的方式,它返回 std::filesystem::space_info 结构体,其中 available 字段即用户可用字节数(考虑配额),capacity 是总容量,free 是未分配但未必可写的空间。
注意点:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
-
std::filesystem::space()接收的是路径(std::filesystem::path),不是文件句柄;传入的路径不必存在,只要能解析到挂载点即可 - 在 Linux 上,若临时目录位于 tmpfs(如
/dev/shm),available可能远小于capacity,因为受内存限制而非磁盘限制 - Windows 上,若路径跨网络驱动器(如
\servershare),space()可能失败并抛异常,需捕获std::filesystem::filesystem_error
完整可运行示例(C++17)
#include <filesystem>
#include <iostream>
int main() {
try {
auto temp_dir = std::filesystem::temp_directory_path();
std::cout << "Temp dir: " << temp_dir << "
";
auto space_info = std::filesystem::space(temp_dir);
std::cout << "Available bytes: " << space_info.available << "
";
} catch (const std::filesystem::filesystem_error& e) {
std::cerr << "FS error: " << e.what() << "
";
return 1;
}
}
编译命令(Linux/macOS):g++ -std=c++17 -lstdc++fs main.cpp;Windows(MSVC)需确保项目属性中启用了 C++17 支持。
为什么不能用 statvfs 或 GetDiskFreeSpaceEx 直接?
这些底层 API 虽然更细粒度,但破坏了可移植性,且容易误判:比如传入 /tmp/subdir 给 statvfs,它返回的是 /tmp 所在文件系统的空间,这本身没错;但若你手动拼接路径(如 "/tmp/" + username)再调用,就可能因路径不存在而失败 —— 而 std::filesystem::space() 内部会自动 resolve 到真实挂载点,容错更强。
真正容易被忽略的是权限和挂载点边界:临时目录可能位于 bind mount、overlayfs 或容器 overlay 层中,available 值反映的是当前进程视角下的可用空间,不是物理磁盘全局剩余量。如果你的应用需要精确预估大文件写入是否成功,务必用目标路径调用 space(),而不是用 getcwd() 或根目录去估算。

















