跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

C++如何获取硬盘分区剩余空间 _ std::filesystem::space用法【实战】

std::filesystem::space 返回 available 常为 0 是因 Windows 下路径不合法(如 "C:" 缺反斜杠)或权限不足;需传入有效卷根路径(如 "C:")、捕获异常并校验路径存在性。 直接用
std::filesystem::space
就能拿到,但 Windows 下需注意路径格式和权限,否则返回 0 或抛异常。 为什么
std::filesystem::space
返回的
available
常为 0? 常见于 Windows 环境下传入了不合法路径(如
"C:"
)或当前进程无权访问目标卷。该函数底层调用系统 API(Windows 是
GetDiskFreeSpaceEx
),路径必须是「有效卷根目录」,且结尾带反斜杠(
"C:\"
)或正斜杠(
"C:/"
)才被识别为卷路径;只写
"C:"
会被当作相对路径处理,结果不可靠。 正确写法:
"C:\"
、
"C:/"
、
R"("D:\")"
错误写法:
"C:"
(缺分隔符)、
"C:\data"
(非根路径,可能跨重解析点或失败) 若路径指向符号链接或挂载点,实际返回的是目标卷数据,不是链接所在路径的逻辑位置 如何安全调用
std::filesystem::space
并处理错误? 它可能抛出
std::filesystem::filesystem_error
(如权限不足、路径不存在),不能忽略。建议显式捕获并 fallback 到已知值(如 -1)或记录日志。
#include #include namespace fs = std::filesystem; int64_t get_available_bytes(const std::string& path) { try { auto space_info = fs::space(path); return static_cast(space_info.available); } catch (const fs::filesystem_error& e) { std::cerr << "space() failed for " << path << ": " << e.what() << ' '; return -1; } } // 示例:获取 C 盘剩余空间 auto avail = get_available_bytes("C:\");
返回值单位是字节,
available
是用户可用空间(扣除配额、系统保留等),
capacity
是总容量,
free
是未分配空间(含系统保留) Linux 下对
/proc/mounts
中的挂载点行为一致;但若路径在 FUSE 或网络文件系统上,结果取决于具体实现 不要对任意用户输入路径直接调用——先用
fs::exists(path)
和
fs::is_directory(path)
做基础校验 跨平台时要注意哪些路径细节? Windows 路径大小写不敏感,但
std::filesystem
对路径字符串不做标准化,所以
"c:"
和
"C:"
都可工作;Linux/macOS 必须用真实大小写,且根路径只能是
"/"
或挂载点路径(如
"/mnt/data"
)。 C知道 CSDN推出的一款AI技术问答工具 下载 立即学习 “ C++免费学习笔记(深入) ”; 推荐统一用正斜杠拼接:
fs::path("C:/").lexically_normal().string()
得到
"C:/"
获取当前驱动器:用
fs::current_path().root_path().string()
,但注意它返回类似
"C:\"
,末尾有反斜杠,可直接传给
space()
Linux 下若传入
"/home"
,返回的是其所在文件系统的剩余空间,不是
/home
目录本身的“使用量”(那是
du
的事) 真正容易被忽略的是:这个函数不刷新缓存,连续多次调用不会自动同步内核最新状态;如果需要高精度实时值(比如做磁盘告警),得接受几秒延迟,或者在关键路径上加
std::this_thread::sleep_for
配合重试——但通常没必要,操作系统本身就有缓存策略。

相关文章