c++中如何获取磁盘剩余空间_c++ filesystem获取磁盘信息方法【实例】
技术百科
冰火之心
发布时间:2026-01-22
浏览: 次 std::filesystem::space() 不直接获取目录所在磁盘剩余空间,需先用 weakly_canonical() 获取根路径再调用;Windows 可用 GetDiskFreeSpaceEx() 更精确,Linux/macOS 应用 statvfs();注意 available 才是普通进程可用空间。
标准 std::filesystem 不提供直接获取磁盘剩余空间的接口,必须用 std::filesystem::space() —— 它返回的是挂载点(如 "C:/" 或 "/")所在文件系统的空间信息,不是某个目录所在分区的“实时”剩余空间。
为什么 std::filesystem::space() 返回值看起来不准?
常见误解是传入任意路径(如 "./data")就能得到该目录所在磁盘的剩余空间。但实际行为取决于实现和操作系统:
- 在 Windows 上,
std::filesystem::space("C:/some/path")通常能正确返回 C 盘信息; - 在 Linux/macOS 上,若路径跨挂载点(比如
/home是独立分区),传入"/home/user/project"可能返回/home分区信息 —— 但前提是底层statvfs()调用成功且路径有效; - 如果路径不存在、无权限、或指向符号链接末端失败,
space()会抛出std::filesystem::filesystem_error。
正确获取指定路径所在文件系统剩余空间的步骤
关键:先用 std::filesystem::canonical() 或 std::filesystem::weakly_canonical() 解析路径到真实挂载点根目录,再调用 space():
-
std::filesystem::canonical(path)要求路径存在,否则抛异常; -
std::filesystem::weakly_canonical(path)更安全,能处理不存在的子路径(如"D:/missing/dir"),它逐级向上找第一个存在的父目录; - 拿到规范化路径后,需提取其所在文件系统的根(Windows 是驱动器号 +
":/",Linux/macOS 是挂载点如"/"或"/home"); - 最稳妥方式是用
std::filesystem::path::root_path()获取根路径,再对根调用space()。
include#include namespace fs = std::filesystem; int main() { try { fs::path p = "C:/temp"; // 或 "/tmp" auto root = fs::weakly_canonical(p).root_path(); auto space_info = fs::space(root); std::cout << "Total: " << space_info.capacity << " bytes\n"; std::cout << "Free: " << space_info.free << " bytes\n"; std::cout << "Available: " << space_info.available << " bytes\n"; } catch (const fs::filesystem_error& e) { std::cerr << "Error: " << e.what() << "\n"; } }
Windows 下用 GetDiskFreeSpaceEx() 更可靠?
是的。当需要精确控制(如区分“可用给当前用户”还是“总空闲”)、绕过 std::filesystem 的路径解析不确定性,或兼容旧版 MSVC(std::filesystem 在 VS2017 前不完整),可直接调 Windows API:
-
GetDiskFreeSpaceEx()返回三个值:lpFreeBytesAvailable(当前用户可用)、lpTotalNumberOfBytes、lpTotalNumberOfFreeBytes; - 注意参数是宽字符路径(
L"C:\\"),需用fs::path::c_str()并转为wchar_t*; - Linux/macOS 则应改用
statvfs(),不能硬写 Windows API。
跨平台代码里混用系统 API 会让维护变重,除非你明确知道目标平台且有特殊需求(比如审计级磁盘报告),否则优先用 std::filesystem::space() + weakly_canonical().root_path() 组合。
真正容易被忽略的是:即使路径合法,space() 返回的 available 字段在某些文件系统(如 ext4 预留 5% 空间给 root)下会小于 free,而普通进程看到的“可用空间”其实是 available —— 写日志或上传前检查容量,必须用这个值,而不是 free。
# ai
# 操作系统
# 的是
# 就能
# 才是
# 第一个
# windows
# 不存在
# 会让
# 可直接
# mac
# 先用
# win
# linux
# macos
# cos
# c++
# stream
# 接口
# 为什么
# 抛出
# ios
# 文件系统
# Filesystem
# wchar_t
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11如何设置开机自动联网 Win11宽带连接
- Mac如何查看电池健康百分比_Mac系统信息电源检
- Win10如何卸载预装Edge扩展_Win10卸载
- php增删改查在php8里有什么变化_新特性对cu
- Win11怎么关闭透明效果_Windows11个性
- 如何在Windows上设置闹钟和计时器_系统自带的
- php条件判断怎么写_ifelse和switchc
- 如何在 Go 中正确测试带 Cookie 的 HT
- Windows怎样关闭开始菜单推荐广告_Windo
- Win11怎么设置应用分屏_Windows11贴靠
- Windows10系统更新错误0x80070002
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- 如何在 Go 中调用动态链接库(.so)中的函数
- Windows10如何更改系统字体大小_Win10
- Windows怎样关闭锁屏广告_Windows关闭
- Windows10系统怎么查看运行时间_Win10
- Win11右键反应慢怎么办 Win11优化右键菜单
- 如何在Golang中优化文件读写性能_使用缓冲和并
- C#如何序列化对象为XML XmlSerializ
- Python配置文件操作教程_JSONINIYAM
- Windows如何拦截腾讯视频广告_Windows
- 如何从 Go 的 map[string]inter
- c++的mutex和lock_guard如何使用
- Win10如何备份注册表_Win10注册表备份步骤
- 如何使用Golang开发简单的聊天室消息存储_Go
- 如何在Golang中配置代码格式化工具_使用gof
- Win11怎样安装网易云音乐_Win11安装网易云
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- php在Linux怎么部署_LNMP环境搭建PHP
- 如何使用Golang实现聊天室消息存档_存储聊天记
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- c++怎么处理多线程死锁_c++ lock_gua
- Python与Docker容器化部署实战_镜像构建
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Win11怎么关闭通知中心_Windows11系统
- VSC怎样在Linux运行PHP_Ubuntu系统
- Python函数接口文档化_自动化说明【指导】
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- php怎么捕获异常_trycatch结构处理运行时
- Win10系统更新错误0x80240034怎么办
- C++如何使用std::transform批量处理
- Go 中的 := 运算符:类型推导机制与使用边界详
- PythonGIL机制理解_多线程限制解析【教程】
- C++中的std::shared_from_thi
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- c++如何判断文件是否存在_c++ filesys
- php查询数据怎么导出csv_查询结果转csv文件
- 如何在Golang中捕获结构体方法错误_Golan
- Win11键盘快捷键大全_Windows 11常用
- Windows10无法连接到Internet_Wi


QQ客服