讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何获取当前运行环境的临时目录大小

冬浩大大_2352

冬浩大大_2352

发布时间:2026-05-31 15:07:35

|

312人浏览过

|

来源于php中文网

原创

Linux/macOS 下用 statvfs 获取 /tmp 所在文件系统总/可用空间最可靠,需用 f_frsize × f_blocks 和 f_frsize × f_bavail 计算,而非 f_bsize 或 f_bfree;Windows 下须先用 GetVolumePathName 提取 TEMP 目录所在卷根,再调用 GetDiskFreeSpaceEx。

c++如何获取当前运行环境的临时目录大小

Linux/macOS 下用 statfs 查临时目录所在文件系统的总/可用空间

临时目录(如 /tmp)本身没有“大小”概念,它只是挂载点上的一个路径;真正可查的是它所在的文件系统容量。直接对 /tmp 调用 statvfs 或 statfs 就行,不用先解析符号链接或判断是否独立挂载——只要路径存在且可访问,系统就能返回其底层文件系统的统计信息。

推荐用 POSIX 标准的 statvfs,兼容性更好:

#include <sys/statvfs.h>
#include <iostream>
<p>int main() {
struct statvfs buf;
if (statvfs("/tmp", &buf) == 0) {
auto total = static_cast<uint64_t>(buf.f_frsize) <em> buf.f_blocks;
auto free = static_cast<uint64_t>(buf.f_frsize) </em> buf.f_bfree;
std::cout << "Total: " << total << " bytes\n";
std::cout << "Free:  " << free << " bytes\n";
}
}
  • f_frsize 是“基本块大小”,不是 f_bsize(I/O 块大小),计算总空间必须用它
  • 如果程序以非 root 权限运行,/tmp 可能受 userquota 或 project quota 限制,statvfs 返回的是文件系统级数据,不反映配额限制
  • 某些容器环境(如 Docker)中 /tmp 是 tmpfs,f_blocks 表示内存页上限,但实际可用可能受 cgroup memory limit 约束,需额外检查 /sys/fs/cgroup/memory/memory.limit_in_bytes

Windows 下用 GetDiskFreeSpaceEx 获取 TEMP 目录所在卷的剩余空间

Windows 没有统一的“临时目录文件系统视图”,得先用 GetTempPath 获取路径,再用 GetVolumePathName 提取卷根(比如把 C:\Users\A\AppData\Local\Temp 归到 C:\),最后调用 GetDiskFreeSpaceEx。

关键点是不能直接传 GetTempPath 结果给 GetDiskFreeSpaceEx——它只接受卷根路径(末尾带反斜杠):

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

立即学习“C++免费学习笔记(深入)”;

#include <windows.h>
#include <iostream>
<p>int main() {
wchar_t tempPath[MAX_PATH];
if (GetTempPath(MAX_PATH, tempPath)) {
wchar_t volumeRoot[MAX_PATH];
if (GetVolumePathName(tempPath, volumeRoot, MAX_PATH)) {
ULARGE_INTEGER free, total, avail;
if (GetDiskFreeSpaceEx(volumeRoot, &free, &total, &avail)) {
std::wcout << L"Free: " << free.QuadPart << L" bytes\n";
}
}
}
}
  • 务必用宽字符版本(GetTempPathW、GetVolumePathNameW),否则在含 Unicode 路径时可能截断或失败
  • GetDiskFreeSpaceEx 返回的 free 是“所有用户可用空间”,而 avail 是“当前用户可用空间”(受磁盘配额影响),一般应优先看 avail
  • 如果程序运行在 Windows Sandbox 或某些精简版系统中,TEMP 可能指向 RAM disk(如 %SystemRoot%\Temp 映射到内存),此时数值反映的是虚拟内存分配上限,而非物理磁盘空间

跨平台封装时注意 std::filesystem::temp_directory_path() 的陷阱

C++17 的 std::filesystem::temp_directory_path() 看起来很理想,但它只返回路径字符串,不保证该路径存在、可写,也不说明它是否跨文件系统。更麻烦的是:它可能返回空、抛异常,或返回一个软链接指向别处(比如 macOS 上 /var/folders/... 实际是 /private/var/folders/...)。

  • 调用前必须用 std::filesystem::exists() 和 std::filesystem::is_directory() 校验,否则 statvfs 或 GetDiskFreeSpaceEx 可能失败
  • Linux 下若 /tmp 是符号链接(如指向 /run/user/1000/tmp),statvfs 仍应传原始路径(/tmp),系统会自动解析;不要自己 read_symlink 后再传目标路径,否则可能误判为另一文件系统
  • 在构建系统(如 CMake)中启用 -std=c++17 且链接 -lstdc++fs(GCC)或确保 MSVC 版本 ≥ 19.20,否则 std::filesystem 功能不可用

为什么不能用 du -sh /tmp 这类命令替代?

执行 shell 命令看似简单,但实际问题很多:权限限制(普通用户无法读取其他用户在 /tmp 创建的目录)、竞态(命令执行瞬间和你后续操作之间空间可能已被占满)、解析开销(要 fork + exec + pipe + 字符串解析),还引入了对 /bin/sh 和外部工具的依赖。

  • 尤其在嵌入式或容器场景中,镜像可能不含 du,或 /tmp 是 noexec 挂载,导致 system() 直接失败
  • 即使成功,du 统计的是当前已用空间,而你真正关心的是“还能写多少”,这必须靠文件系统级接口(statvfs/GetDiskFreeSpaceEx)获取剩余配额
  • 若真要用命令,至少用 find /tmp -xdev -type f -printf "%s\n" 2>/dev/null | awk '{sum += $1} END {print sum+0}' 避免跨文件系统,但仍不解决根本问题

临时目录的“大小”本质是运行时上下文问题:它取决于挂载选项、配额策略、cgroup 限制、甚至 SELinux 策略。硬编码路径或依赖外部工具只会让逻辑更脆弱。最稳的方式,是始终基于实际使用的路径做 statvfs 或等价系统调用,并准备好 fallback 路径(比如 /tmp 不可用时尝试 PWD 所在目录)。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2148

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

959

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

387

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

560

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1177

2024.03.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn