Windows和Linux C++判断磁盘空间是否充足

news2024/9/20 16:37:02

        基本是由百度Ai写代码生成的,记录一下。实现此功能需要调用系统的API函数。

        对于Windows,可调用函数GetDiskFreeSpaceEx,使用该函数需要包含头文件windows.h。该函数的原型:

        它的四个参数:

lpDirectoryName(入参):磁盘上的一个目录。此参数不是必须要传递磁盘分区的根目录。比如我要判断D盘的空间是否充足,传递D盘根目录路径或者D盘任一个目录的路径都是可以的。如果传递NULL,表示当前磁盘分区的根目录路径。如果传递一个UNC name,则必须包含尾部的反斜杠,例如:"\\MyServer\MyShare\"。

lpFreeBytesAvailableToCaller(出参):一个变量的指针,此变量接收指定的磁盘分区上,与调用线程相关联的用户,可使用的可用字节总数。如不需要接收,可传为NULL。

lpTotalNumberOfBytes(出参):一个变量的指针,此变量接收指定的磁盘分区上,与调用线程相关联的用户,可使用的总字节数。如不需要接收,可传为NULL。

lpTotalNumberOfFreeBytes(出参):一个变量的指针,此变量接收指定的磁盘分区上的空闲字节总数。如不需要接收,可传为NULL。

        我的需求是判断程序当前所在的磁盘分区的空间是否充足,因此lpDirectoryName可以传为NULL,结合百度AI生成的代码,真正需要接收的是lpTotalNumberOfFreeBytes,因此将lpFreeBytesAvailableToCaller和lpTotalNumberOfBytes也传为NULL。而lpTotalNumberOfFreeBytes的类型是ULARGE_INTEGER,它是一个联合

微软官方的解释:

由于我的编译器是支持64位整型的。因此使用成员QuadPart返回空闲字节数。将判断磁盘空间是否充足的功能封装成一个函数,调用此函数时传递我们设定的磁盘空间大小。如果磁盘空间的空闲字节数不小于设定值,判定为空间充足,反之判定为空间不足。如果获取空闲字节数失败也判定为空间不足。Windows的代码:

#include <iostream>
#include <windows.h>

using namespace std;

/// <summary>
/// 判断指定的磁盘分区的剩余空间是否充足
/// 剩余空间不小于设定的最小值判定为空间充足,否则为空间不足
/// </summary>
/// <param name="minFreeSpace">剩余空间设定的最小值</param>
/// <returns>剩余空间是否充足</returns>
bool isDiskSpaceSufficient(unsigned __int64 minFreeSpace) {
	ULARGE_INTEGER totalFreeBytes;// 本磁盘分区的空闲字节数

	if (GetDiskFreeSpaceEx(NULL, NULL, NULL, &totalFreeBytes)) {	
		cout << "本磁盘分区的空闲字节数:" << totalFreeBytes.QuadPart << endl;
		return totalFreeBytes.QuadPart >= minFreeSpace;
	}
	else {
		cerr << "获取当前磁盘分区的空闲大小失败!" << endl;

		return false;
	}
}

int main(void) {
	unsigned __int64 minFreeSpace = 1024 * 1024 * 1024;// 磁盘分区的最小空间(字节),小于此值认为空间不足

	if (isDiskSpaceSufficient(minFreeSpace))
		cout << "当前磁盘分区空间充足。" << endl;
	else
		cout << "当前磁盘分区空间不足。" << endl;

	return 0;
}

        对于Linux,可以调用函数statvfs(),调用它需要包含头文件sys/statvfs.h,该函数的原型:

int statvfs(const char *path, struct statvfs *buf);

参数path是要获取磁盘信息的路径,参数buf是statvfs结构体的指针。如果获取信息成功,函数返回0;获取失败返回-1。

        获取到的磁盘信息将存放到statvfs结构体buf中,该结构体的成员:

成员f_bfree表示空闲块的数量,f_bavail表示非特权用户的空闲块数量,f_bsize表示文件系统块的大小。空闲块数乘以块大小就是磁盘的空闲空间。关于空闲块数,由于我是用普通用户来执行程序,因此我用的是f_bavail,而不是f_bfree。

        另外,需要调用函数getcwd()获取程序当前的工作目录,然后将其传给statvfs()的参数path。使用此函数需要包含头文件unistd.h,该函数原型:

char *getcwd(char *buf, size_t size);

获取到的目录的绝对路径将保存到参数buf中,参数size是buf的大小。获取成功后,函数会返回buf的指针,获取失败则返回NULL。Linux的代码:

#include <iostream>
#include <sys/statvfs.h>
#include <unistd.h>
#include <limits.h>
#include <cstring>

using namespace std;

/// <summary>
/// 判断磁盘空间是否充足
/// </summary>
/// <param name="requiredSpace">需要的最小磁盘空间(字节)</param>
/// <returns>磁盘空间是否充足</returns>
bool isDiskSpaceSufficient(unsigned long long requiredSpace) 
{
	struct statvfs fs_info;// 文件系统信息
	char cwd[PATH_MAX];// 程序当前工作目录
	memset(cwd, 0, PATH_MAX);
	// 获取程序当前工作目录
	// 若获取失败不再继续判断磁盘空间是否充足,直接按空间不足返回
	if (!getcwd(cwd, sizeof(cwd))) 
	{
		cerr << "获取程序当前工作目录失败。" << endl;
		return false;
	}
	// 获取文件系统信息
	// 若获取失败不再继续判断空间是否充足,直接按空间不足返回
	if (statvfs(cwd, &fs_info))
	{
		cerr << "获取文件系统信息失败。" << endl;
		return false;
	}
	// 判断磁盘空间是否充足
	unsigned long long availableSpace = (unsigned long long)(fs_info.f_bavail * fs_info.f_bsize);
	cout << "磁盘可用空间: " << availableSpace << "字节。" << endl;

	return availableSpace >= requiredSpace;
}

int main(void) 
{
	unsigned long long requiredSpace = 1024 * 1024 * 1024; // 需要的最小空间(字节)
	// 判断程序工作目录的磁盘空间是否充足
	if (isDiskSpaceSufficient(requiredSpace)) 
		cout << "磁盘空间充足。" << endl;
	else 
		cout << "磁盘空间不足。" << endl;

	return 0;
}

参考文章:

GetDiskFreeSpaceExW function (fileapi.h):https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdiskfreespaceexw

ULARGE_INTEGER union (winnt.h):

https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/ns-winnt-ularge_integer-r1

Linux statvfs()获取系统磁盘信息:https://www.cnblogs.com/fortunely/p/17212612.html

getcwd:https://baike.baidu.com/item/getcwd/4746955?fr=ge_ala

getcwd函数:https://wenku.baidu.com/view/d92bfe6b084e767f5acfa1c7aa00b52acfc79cb5.html?_wkts_=1719541905888&bdQuery=getcwd%E5%87%BD%E6%95%B0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gitlab上传代码时自动触发Jenkins构建代码配置

Jenkins配置构建触发器&#xff0c;勾选Build when a change is pushed to GitLab 记得记住对应url 在下面生成一个Jenkins的Secret token 打开Gitlab配置Webhooks 保存后测试 可正常构建并推送

DIY:在您的 PC 上本地使用 Stable Diffusion AI 模型生成图像

前言 随着DALL-E-2和Midjourney的发布&#xff0c;您可能听说过最近 AI 生成艺术的繁荣。这些人工智能模型如何在几秒钟内创造性地生成逼真的图像&#xff0c;这绝对是令人兴奋的。您可以在这里查看其中的一些&#xff1a;DALL-E-2 gallery和Midjourney gallery 但是这些模型…

Linux-引导过程与服务控制

目录 一、Linux操作系统引导过程 1、引导过程总览 2、引导过程详解 2.1、开机自检&#xff08;BIOS&#xff09; 2.2、 MBR引导 2.3、GRUB菜单 2.4、加载内核(kernel) 2.5、init进程初始化 3、系统初始化进程 3.1、Systemd单元类型 3.2、运行级别所对应的 Systemd 目…

湖北大学2024年成人高考函授报名专升本汉语言文学专业介绍

湖北大学&#xff0c;这所历史底蕴深厚的学府&#xff0c;自创办以来&#xff0c;始终致力于为社会各界人士提供高质量的成人高等继续教育。而今&#xff0c;为了满足广大成年人对于知识更新的渴求&#xff0c;学校特别开放了专升本汉语言文学专业的报名通道&#xff0c;为那些…

揭开免费可视化工具流行背后的原因

免费可视化工具为什么越来越受欢迎&#xff1f;在大数据时代&#xff0c;数据可视化已经成为各行各业的重要工具。它不仅帮助企业和个人更直观地理解数据&#xff0c;还在决策过程中起到关键作用。尽管市场上有许多付费的数据可视化工具&#xff0c;但免费工具的受欢迎程度却在…

rtthread 设备驱动 示例

添加自定义驱动效果 驱动 my_test_driver.c #include <stdint.h> #include <stdio.h> #include <rtthread.h> /*** brief 驱动初始化设备* * param device 需要初始化的设备* return rt_err_t 返回初始化状态*/ rt_err_t my_test_driver_init(struct rt_de…

RAID在VPS主机中的作用是什么?

您是否担心过网站的可靠性&#xff1f;有时候网站会崩溃。服务器会不稳定。 在高峰时段&#xff0c;即使最好的网站也会变得很慢&#xff0c;让人很烦。 这就是VPS主机发挥作用的地方——为您的在线网络奠定坚实的基础。 想进一步提升稳定和可扩展&#xff1f;这就是RAID…

【YOLOv8模型onnx部署详解】YOLOv8模型转onnx格式并使用onnxruntime 进行推理部署

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

讲透一个强大算法模型,Transformer !!

好像一直以来都没有和大家讨论过一个贼牛的模型 – Transformer&#xff01; 首先&#xff0c;咱们先用很直白的语言描述一下&#xff1a;想象你在读一本书&#xff0c;每一页都有很多词。如果你每次只能看到一个词&#xff0c;那么理解整本书会很慢。而Transformer模型就像是…

备忘录标签怎么弄 备忘录标签设置方法

在繁忙的生活中&#xff0c;我们常常需要记录各种琐事、工作任务和灵感闪现。备忘录成了我们不可或缺的助手&#xff0c;但随着时间的推移&#xff0c;备忘录里的内容越来越多&#xff0c;如何高效地管理和查找这些信息成了一个大问题。这时&#xff0c;备忘录的标签功能就显得…

TDengine 推出新连接器,与 Wonderware Historian 无缝连接

在最新发布的TDengine 3.2.3.0 版本中&#xff0c;我们进一步更新了 TDengine 的数据接入功能&#xff0c;推出了一款新的连接器&#xff0c;旨在实现 Wonderware Historian&#xff08;现称为 AVEVA Historian&#xff09;与 TDengine 的集成。这一更新提供了更加便捷和高效的…

【新手友好】计算机SCI期刊,IF=3+,编辑负责,修改稿件认真

一、期刊名称 Journal of Communications and Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.6 中科院分区&#xff1a;3区 三、期刊征稿范围 《通信与网络杂志》每年出版六期&#xff0c;致力于发表高质量的…

【NeRF】ExtraNeRF:基于扩散模型的NeRF可见性视角外延

项目主页&#xff1a;https://shihmengli.github.io/extranerf-website/ 来源&#xff1a;华盛顿大学&#xff0c;康奈尔大学&#xff0c;谷歌研究&#xff0c;加州大学伯克利分校 标题&#xff1a;ExtraNeRF: Visibility-Aware View Extrapolation of Neural Radiance Fields …

OurBMC运营委员会2024年上半年度例会顺利召开

6 月 27 日&#xff0c;OurBMC 社区运营委员会 2024 年上半年度例会顺利召开。本次会议采用线上线下结合的方式&#xff0c;各委员在会上听取了 2024 年上半年社区运营委员会的工作总结汇报&#xff0c;并规划了下半年运营重点工作&#xff0c;同时针对社区活动改进、运营规划开…

【系统架构设计师】七、信息安全技术基础知识(网络安全技术|网络与信息安全风险|网络安全协议)

目录 一、网络安全技术 1.1 防火墙 1.2 入侵检测系统IDS 1.3 入侵防御系统IPS 1.4 杀毒软件 1.5 蜜罐系统 二、网络与信息安全风险 三、网络安全协议 四、相关推荐 五、历年真题练习 一、网络安全技术 1.1 防火墙 防火墙是在内部网络和外部因特网之间增加的一道安全…

四川赤橙宏海商务信息咨询有限公司抖音开店靠谱吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度发展。而在这个大潮中&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其专业的团队和前瞻性的战略眼光&#xff0c;专注于抖音电商服务&#xff0c;为广大商家提供了一站式解决方案&#xff0c;成为了行业…

开放式耳机哪个牌子好?2024热门红榜开放式耳机测评真实篇!

当你跟朋友们聊天时&#xff0c;他们经常抱怨说长时间戴耳机会令耳朵感到不适,后台也有很多人来滴滴我&#xff0c;作为一位致力于开放式耳机的测评博主&#xff0c;在对比了多款开放式耳机之后&#xff0c;你开放式耳机在保护听力方面确实有用。开放式的设计有助于减轻耳道内的…

第31讲:K8S StorageClass使用rbd-provisioner驱动与Ceph RBD块存储集成

文章目录 1.rbd-provisioner驱动介绍2.在K8S集群中部署外部的rbd-provisioner驱动2.1.将Ceph集群的认证文件和配置上传到K8S的各个节点2.2.获取外部rbd-provisioner驱动的资源编排文件2.3.在集群中部署rbd-provisioner驱动程序2.4.进入rbd-provisioner容器中查看Ceph的配置文件…

[数据结构】——七种常见排序

文章目录 前言 一.冒泡排序二.选择排序三.插入排序四.希尔排序五.堆排序六.快速排序hoare挖坑法前后指针快排递归实现&#xff1a;快排非递归实现&#xff1a; 七、归并排序归并递归实现&#xff1a;归并非递归实现&#xff1a; 八、各个排序的对比图 前言 排序&#xff1a;所谓…

CentOS停止维护,如何应对?

一、事件背景 2020年12月08日&#xff0c;CentOS官方宣布了停止维护CentOS Linux的计划&#xff0c;并推出了CentOS Stream项目。 更多信息&#xff0c;请参见CentOS官方公告。 版本变化说明CentOS 9不再支持新的软件和补丁更新CentOS 82021年12月31日停止维护服务CentOS 720…