当前位置: 首页 > article >正文

C++编程实践—C++处理磁盘大小

一、磁盘容量监控在实际的编程经常会遇到对磁盘容量进行监控的情况。当磁盘的应用达到一个阀值时就需要向用户发出报警信息并针对具体的操作进行限制以防止出现意外的事故。一般来说对硬盘的处理都是各个平台提供自己专属的API来保证对硬盘容量获取的准确性。但随着C标准的演进在C17中也提供了相关的方法。在前面的“Linux下获得磁盘和目录大小”中已经给出了一个完整的例子。本文将通过C17标准中的方法与之对比可以更好的理解相关的应用。二、Linux下传统的方式在Linux中对硬盘的监控的方法有几种方法使用命令方式可以通过命令行或在C中使用相关接口如system来实现命令的调用iRetpopen(cmd.c_str()r);fgets(buffer.data(),buffer.size(),pipe.get()buffer.data()中就是相关的内容使用statvfs接口此函数是POSIX推荐的接口头文件为 sys/statvfs.h相对上层应用方式如下intretstatvfs(devInfo.mountPoint.c_str(),fsStat);使用statfs它需要包含#include sys/vfs.h 或 #include sys/statfs.h是一个更底层的函数。应用如下retstatfs(path.c_str(),s);三、Windows下传统的方式在Windows平台上std::filesystem::space接口是使用GetDiskFreeSpaceExW接口来实现的。其定义如下BOOLGetDiskFreeSpaceEx(LPCWSTR lpRootPathName,// 根路径PULARGE_INTEGER lpFreeBytesAvailable,// 用户可用空间 : space_info.availablePULARGE_INTEGER lpTotalNumberOfBytes,// 总空间 :space_info.capacityPULARGE_INTEGER lpTotalNumberOfFreeBytes// 总空闲空间 : space_info.free);四、c17中的方法在C17后标准库提供了库其中的std::filesystem::space可以用来获取相关的磁盘的信息。其基本的定义如下structspace_info{std::uintmax_tcapacity;//文件系统的总大小单位为字节std::uintmax_tfree;//可用空间单位为字节std::uintmax_tavailable;//非特权进程可用的空闲空间可能小于free};在Linux上其具体的实现其实就是调用statvfs接口。使用它需要注意以下几点权限在Linux上很多情况下需要权限否则可能无法成功读取相关的文件系统信息。此时要注意看返回的错误代码不同分区处理可能需要遍历所有的挂载点。这需要去读取/proc/mounts或/etc/mtab然后再次调用相关接口即可需要注意平台是32位还是64位。32位情况下可能对大磁盘大于2T的信息描述不对。因为使用字节描述可能会溢出五、例程下面看传统的实现以及C17的实现例程Windows平台#includewindows.h#includeiostream#includestringboolGetDiskSpaceInfo(conststd::wstringpath,unsignedlonglongtotalBytes,unsignedlonglongfreeBytes,unsignedlonglongavailableBytes){ULARGE_INTEGER totalAvailable;ULARGE_INTEGER totalBytes;ULARGE_INTEGER totalFreeBytes;BOOL retGetDiskFreeSpaceExW(path.c_str(),totalAvailable,totalBytes,totalFreeBytes);if(!ret){returnfalse;}availableBytestotalAvailable.QuadPart;totalBytestotalBytes.QuadPart;freeBytestotalFreeBytes.QuadPart;returntrue;}//GBstd::stringFormatBytes(unsignedlonglongbytes){constdoublegbbytes/(1024.0*1024.0*1024.0);charbuf[64];snprintf(buf,sizeof(buf),%.2f GB,gb);returnstd::string(buf);}intmain(){std::wstring pathLC:\\;unsignedlonglongtotal,freeSpace,available;GetDiskSpaceInfo(path,total,freeSpace,available);return0;}Linux中传统的应用可参看“Linux下获得磁盘和目录大小”的例程。下面看C17实现来自cppreference#includecstdint#includefilesystem#includeiostream#includelocalestd::uintmax_tdisk_usage_percent(conststd::filesystem::space_infosi,bool is_privilegedfalse)noexcept{if(constexpr std::uintmax_tX(-1);si.capacity0||si.free0||si.available0||si.capacityX||si.freeX||si.availableX)return100;std::uintmax_tunused_spacesi.free,capacitysi.capacity;if(!is_privileged){conststd::uintmax_tprivileged_only_spacesi.free-si.available;unused_space-privileged_only_space;capacity-privileged_only_space;}conststd::uintmax_tused_space{capacity-unused_space};return100*used_space/capacity;}voidprint_disk_space_info(autoconstdirs,intwidth14){(std::coutstd::left).imbue(std::locale(en_US.UTF-8));for(constautos:{Capacity,Free,Available,Use%,Dir})std::cout│ std::setw(width)s ;for(std::cout\n;autoconstdir:dirs){std::error_code ec;conststd::filesystem::space_info sistd::filesystem::space(dir,ec);for(autox:{si.capacity,si.free,si.available,disk_usage_percent(si)})std::cout│ std::setw(width)static_caststd::intmax_t(x) ;std::cout│ dir\n;}}intmain(){constautodirs{/dev/null,/tmp,/home,/proc,/null};print_disk_space_info(dirs);}上面的代码还是比较简单的不过要想弄清楚建议还是上机真正调试一下。六、总结通过上面的分析可以发现抽象的层次就是不断的为终端用户减负而把具体的复杂实现隐藏在接口内部。这也给开发者提供了具象化的实践例子。这也符合软件设计中的抽象层解决一切的情况。

相关文章:

C++编程实践—C++处理磁盘大小

一、磁盘容量监控 在实际的编程,经常会遇到对磁盘容量进行监控的情况。当磁盘的应用达到一个阀值时,就需要向用户发出报警信息,并针对具体的操作进行限制,以防止出现意外的事故。一般来说,对硬盘的处理,都是…...

电动汽车集群并网的分布式鲁棒优化调度 电动汽车集群优化 采用matlab+yalmip编程,设...

电动汽车集群并网的分布式鲁棒优化调度 电动汽车集群优化 采用matlabyalmip编程,设置电动汽车3类需求方式,三类需求方式映射着 EV 用户不同的需求偏好: 第 1 类方式表示用户期望最小化充电时间, 第2类方式表示用户期望降低并网费用…...

为什么积分运算电路在反馈电容上要并联电阻

1. 防止输出漂移和饱和(直流稳定性)这是最主要的原因。理想情况:在理想积分器中,如果没有输入信号,电容会保持电荷,输出电压应保持不变。现实情况:实际运放都存在输入偏置电流(Ib&am…...

亚马逊Rufus与AI工具Gemini3实战教程|AMC广告人群包+DSP投放+Listing优化全套资料合集

温馨提示:文末有联系方式一、Rufus深度应用:亚马逊AI助手实战解析 深入解读Rufus在关键词挖掘、竞品分析、Review情感洞察及实时市场趋势判断中的落地用法,附实操截图与Prompt模板,助快速掌握AI驱动决策新范式。二、Gemini3指令库…...

NDW系列微机控制材料扭转试验机

NDW系列微机控制材料扭转试验机一、用途:NDW系列微机控制扭转试验机适用于金属材料、非金属材料、复合材料以及构件的扭转性能测试试验。可根据国家标准《GB/T10128-2007金属材料 室温扭转试验方法》、JB/T9370-2015《扭转试验机 技术规范》、JJG 269-2006《扭转试验…...

COMSOL Multiphysics中的注浆模拟:考虑浆液粘度时空变化

COMSOL Multiphysics注浆,考虑浆液粘度时空变化。 注浆模拟。在地下工程注浆施工中,浆液粘度像极了青春期孩子的脾气——随时都在变化。这种时空变异特性如果不在数值模拟中考虑,计算结果可能会和现场数据产生"卖家秀"与"买家…...

为2026年控烟宣传找图,这五类站点的筛选顺序很关键

作为社区健康中心的运营人员,我上周接到了一个紧急任务:为即将到来的世界无烟日,设计一张宣传海报,要求视觉冲击力强但不能过于骇人,并且必须在第二天上午提交初稿。时间紧迫,从零开始设计显然不现实。我的…...

黑龙江GEO,AI搜索优化黑龙江GEO,AI搜索优化品牌排行榜

在数字化浪潮下,黑龙江地区的企业和店铺面临着激烈的市场竞争,如何在AI搜索中脱颖而出成为了关键问题。知动网络技术服务有限公司,作为一家正规注册的老牌有限责任公司,在AI搜索优化与GEO服务领域深耕多年,为您提供专业…...

JDBC(MySQL)——DAY04(调用存储过程,存储函数)

今天针对JDBC中调用存储过程和存储函数进行了学习,学习内容如下:1.JDBC中调用存储过程:调用存储过程需要用到PreparedCall,专门用来处理调用存储过程和存储函数,迄今为止我学了三个Connection创建的陈述对象了&#xf…...

CLion开发STM32(三)DSP库移植

首先DSP库源码可以从官方github下载,链接如下: https://github.com/ARM-software/CMSIS-DSP 笔者所用版本为1.17.0,本文以此版本为例。 添加DSP库也是通过配置CMakeLists.txt文件进行,主要有两种方式: 1. 直接添加…...

电流镜运放的失配教学,两份文档电路 非常适合新手,基础训练很重要,下载即可直接使用 1

电流镜运放的失配教学,两份文档电路 非常适合新手,基础训练很重要,下载即可直接使用 1,电流镜失配 current mismatch 两种经典的一级电流镜 cascode 电流镜 2,主要以五管OTA运放为例子,怎么用Cadence软件测…...

给你一张清单 10个AI论文工具测评:本科生毕业论文写作必备指南

在当前高校教育日益重视学术规范与写作质量的背景下,本科生毕业论文的撰写正面临前所未有的挑战。从选题构思到文献综述,从结构搭建到语言润色,每一个环节都可能成为学生们的“拦路虎”。与此同时,AI写作工具的兴起为这一难题提供…...

Golang--协程调度

协程 bilibili Goroutine调度模型 早期调度模型 G:goroutine,Go协程,对应数据结构:runtime.gM:machine,工作线程,对应数据结构:runtime.m 在程序地址空间的数据段中有重要的全局…...

Python模拟墨子号量子加密通信

一、前言 本文将从环境搭建、模块拆分、代码实现到测试验证,完整讲解如何基于本源量子云平台实现 BB84 量子密钥分发协议,涵盖本地模拟和真机调用两种模式,代码模块化设计,可直接复用,适合量子计算初学者快速上手。 …...

新能源动力总成台架试验室全面建设规划:动力电池、电机及电力电子件试验室布局与实施方案

新能源动力总成台架试验室能力建设规划,70页PPT 动力电池,电机,电驱动总成,其他控制器等电力电子件试验室建设"搞电池测试?先学会和BMS对话"——这是某次凌晨三点我在试验室改协议解析脚本时顿悟的真理。动力…...

从抱怨访问速率限制到建立完整镜像站,大厂在开源生态扩张中是否正在利用技术霸权扼杀初创项目的生存空间?

## 开源镜像站背后:大厂的技术扩张与初创项目的生存夹缝 最近在技术社区里,经常能看到一些关于开源项目访问速率限制的抱怨。比如某个知名的代码托管平台,突然对未登录用户或者免费账户的API调用次数做了严格限制,导致一些自动化脚…...

纯电动车动态跟随能量管理策略

纯电车动态跟随能量管理策略近年来,纯电动车(BEV)的普及速度越来越快,而如何有效管理车辆的能量使用,成为了提升驾驶体验和延长续航里程的关键问题。在城市道路中,纯电动车常常面临频繁的启停和加速减速的情…...

天心大师也谈浮躁的人工智能,当孟子遇见AI,仁义何在?

有关AI的伦理、价值与未来走向的讨论从未停歇。天心大师,今日也谈及了人工智能发展中所显现的“浮躁”之气,并提出了引人深思的命题:当两千多年前倡导“仁义礼智信”的孟子,遇见了以算法和数据驱动的现代AI,将会碰撞出…...

爆火的“小龙虾“OpenClaw:风口之下,别让便利埋了安全隐患

爆火的"小龙虾"OpenClaw:风口之下,别让便利埋了安全隐患写在开头一、顶流"小龙虾":凭什么刷爆全网?职场办公神器运维得力助手行业深度赋能二、急转直下!官方预警 企业禁令,风险彻底暴…...

基于单片机与矩阵按键的门禁系统Proteus仿真程序:密码验证与电磁锁控制

单片机1602矩阵按键 门禁系统Proteus仿真程序--------------------------------------------| 第1列 第2列 第3列 第4列 ||第1行 0 1 2 3 ||第2行 4 5 6 7 | 初始密码:1234…...

首次全年盈利,同比增长453%!寒武纪2025年报很亮眼

一张图解读版(来源寒武纪官微): 2025年,这家成立九年的智能芯片企业首次实现全年盈利,营收突破64亿元,净利润超过20亿元。这家曾被质疑能否存活的硬科技公司,用实打实的数据证明了自己的价值。 …...

显存暴降92%!哈工大为线性注意力开辟了新道路

2017年,Transformer模型横空出世,在自然语言处理领域掀起了AI革命。此后,视觉领域也迎来了Transformer的浪潮,从图像分类到目标检测,从语义分割到图像生成,注意力机制几乎渗透到了计算机视觉的每一个角落。…...

【LLM进阶-Agent】8. Reflexion Agent 介绍

深度解析 LLM Agent 演进:从 ReAct 到 Reflexion 的“自我反思”之路 在复杂任务场景下,业界早期广泛采用的是 ReAct (Reason Act) 范式。然而,在实际落地中我们常常发现:大模型像是一个固执且健忘的员工。当它陷入幻觉或采取错误…...

风光储并网控制系统的设计与Matlab Simulink仿真建模研究

风光储并网控制系统,Matlab/simulink仿真建模搞风光储并网控制系统仿真的人都知道,Simulink里那堆复杂的模块看着就头大。不过别慌,咱们今天用最糙的实操方式,手把手拆解这个系统。先来张全家福(不是让你真的拍照&…...

OpenClaw玩转有道云笔记

用通俗语言拆解工作逻辑和实操细节(每步校验、避坑提示),全程贴合新手视角,确保原理易懂、操作能直接落地,解决安装、配置、使用中的各类常见问题。 YoudaoNote Skills 是有道云笔记平台官方提供的OpenClaw插件(类似“功能扩展工具”),核心作用是“让 OpenClaw 能直接…...

小程序毕业设计-基于微信小程序的乡村治理数字化平台的设计与实现

基于微信小程序的乡村治理数字化平台的设计与实现技术说明: 用户前端:微信小程序原生框架 管理前端Vue.js 服务端(后端):基于java的Sprinboot框架 数据库:MySQL 功能说明: 小程序端 1.轮播图片 2.乡村资讯乡村快讯春耕播种政策服务预警信息 3.乡村服务-预约户籍办理婚姻登记土地…...

SAM2:使用mask作为提示输入,实现VOS视频分割

8k50o45u_seg目录 1. 引言 2. 使用SAM2实现VOS任务 2.1 数据集 2.2 主要函数 2.3 主要代码 3. 结果展示 1. 引言 本文尝试使用SAM2模型来实现VOS任务。由于在官方的github代码中只找到了point或者box作为提示,但是论文中却说明是可以输入mask作为提示的&#…...

vue+uniapp小程序Python美食菜品点餐订单系统

目录 技术选型与架构设计前端功能模块划分后端API开发关键实现细节测试与部署 项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术选型与架构设计 前端采用Vue.jsUniapp框架,实现跨平台小…...

Element Plus - 在 el-select 的每个选项右侧添加按钮

在 el-select 的每个选项右侧添加按钮 <el-select v-model"formData.encryptMethod" placeholder"请选择加密方式"><el-option v-for"item in encryptMethods" :key"item.value" :label"item.label" :value"i…...

C++编程法则365天(359)lamba是如何捕获变量

文章目录 一、Lambda捕获的核心前提:Lambda的本质是“匿名仿函数” 二、不同捕获方式的实现细节 1. 值捕获([x] 或 [=]) 2. 引用捕获([&x] 或 [&]) 3. 捕获this指针([this] 或 [=]/[&] 在类中) 4. 隐式捕获([=] 或 [&]) 5. C++14新增:初始化捕获([x…...