商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > C++如何获取操作系统的默认临时文件夹磁盘剩余可用字节数

C++如何获取操作系统的默认临时文件夹磁盘剩余可用字节数

  发布于2026-06-29 阅读(0)

扫一扫,手机访问

很多人以为,拿到系统临时目录的路径就完事了——std::filesystem::temp_directory_path() 确实能返回一个路径,但它不提供磁盘空间信息。要获取临时目录所在磁盘的剩余可用字节数,必须分平台处理,并且要注意一些容易翻车的细节。

先说核心思路:先解析出路径挂载在哪个卷或文件系统上,再调用对应的磁盘空间查询 API。听起来不算复杂,但实战中坑不少。

Windows 下:GetDiskFreeSpaceEx 搞定

Windows 的临时目录通常是 %TEMP%%SystemRoot%\Temp,路径长这样:C:\Users\XXX\AppData\Local\Temp。关键一步是提取盘符,比如 C:,然后传给 GetDiskFreeSpaceEx

具体怎么做?std::filesystem::temp_directory_path() 返回的是完整路径,用 .root_name() 就能提取出盘符。注意,这个返回值是 std::filesystem::path 类型,需要转成 std::wstring 才能给 Win32 API 用。而 GetDiskFreeSpaceEx 的第三个参数 lpFreeBytesA vailable 返回的是“非特权用户可用字节数”,这通常就是你要的实际可用空间。

但有一个特殊情况:如果临时路径是符号链接或网络路径(比如 \\server\share),root_name() 可能为空。这时候得 fallback 到 GetCurrentDirectory 所在卷,或者用 GetDriveType 检查一下。最稳妥的写法是这样:

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(比如 /run/user/1000),它们可能位于不同文件系统上。因此,必须对临时目录路径本身调用 statvfs,而不是对父目录或根目录。

需要注意:statvfs 返回的 f_ba vail * f_frsize 是“非特权用户可用块数 × 块大小”,比 f_bfree 更准确,因为后者考虑了 root 可用的部分。另一个坑是,std::filesystem::temp_directory_path() 在 Linux 上可能返回 /tmp,但在某些发行版或容器环境里可能是 /run/user/1000。不能硬编码路径,必须动态获取。

如果 statvfs 调用失败(比如路径不存在或权限不足),可以 fallback 到 getenv("TMPDIR")"/tmp" 再试一次。标准写法:

auto temp = std::filesystem::temp_directory_path();
struct statvfs sv;
if (statvfs(temp.c_str(), &sv) == 0) {
    uint64_t bytes = static_cast(sv.f_ba vail) * sv.f_frsize;
}

跨平台封装时,最容易忽略的三件事

别以为写一个 get_temp_disk_free_bytes() 函数就能覆盖所有情况。实际调用中,这三处最容易出问题:

  • 路径有效性std::filesystem::temp_directory_path() 可能抛出 std::filesystem::filesystem_error 异常,比如权限不足读取 $HOME。记得用 try-catch 包裹,别让程序直接崩溃。
  • 符号链接穿透:Linux 下 /tmp 可能是一个符号链接,指向 /dev/shm 或其他挂载点。好消息是 statvfs 会自动解析符号链接。但 Windows 的 GetDiskFreeSpaceEx 对 UNC 路径(网络路径)可能不支持,需要提前用 GetFinalPathNameByHandle 把符号链接展开。
  • 单位混淆:Windows 的 ULARGE_INTEGER 和 POSIX 的 unsigned long 都是 64 位,但 C++ 里直接存成 uint64_t 最安全。别用 size_t——在 32 位平台上它只有 32 位,很容易溢出。

临时目录的位置本身就不稳定(尤其是 Linux 环境下),而磁盘空间是一个瞬时值。拿到数字后尽快使用,不要缓存,也不要假设它在整个程序生命周期内有效。毕竟,文件系统随时可能变化。

本文转载于:https://www.php.cn/faq/2734855.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注