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

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

        基本是由百度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;elsecout << "当前磁盘分区空间不足。" << 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

相关文章:

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

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…...

数据访问层如何提取数据到其他层,其他类中

当然可以&#xff0c;以下是一些具体的例子&#xff0c;展示了如何将数据库访问逻辑封装在一个单独的类中&#xff0c;并在其他类中使用这个类来获取数据。 数据库访问类&#xff08;DatabaseAccess.java&#xff09;&#xff1a; java复制代码 import java.sql.*; import ja…...

【JS】AI总结:JavaScript中常用的判空方法

在JavaScript中&#xff0c;判空是一个常见的操作&#xff0c;因为变量可能未定义、未初始化或包含特定的空值。以下是JavaScript中常用的判空方法&#xff1a; 使用if语句直接判断&#xff1a; 如果变量是null、undefined、0、NaN、空字符串&#xff08;""&#xff…...

Rust单元测试、集成测试

单元测试、集成测试 在了解了如何在 Rust 中写测试用例后&#xff0c;本章节我们将学习如何实现单元测试、集成测试&#xff0c;其实它们用到的技术还是上一章节中的测试技术&#xff0c;只不过对如何组织测试代码提出了新的要求。 单元测试 单元测试目标是测试某一个代码单…...

vue全局方法plugins/utils

一、在src目录下创建一个plugins文件夹 test.ts文件存放创建的方法&#xff0c;index.ts用于接收所有自定义方法进行统一处理 二、编写自定义方法 // test.ts文件 export default {handleTest(val1: number, val2: number) {// 只是一个求和的方法return val1 val2;}, };三…...

高阶算法班从入门到精通之路

课程介绍 本课程旨在帮助学员深入理解算法与数据结构的核心概念&#xff0c;从而掌握高级算法设计与分析技能。每集课程内容精心设计&#xff0c;涵盖了常用数据结构、经典算法及其应用场景等方面的深度讲解&#xff0c;同时通过大量实例演练&#xff0c;帮助学员提升解决实际…...

C++ 左值右值

文章目录 概述左值右值右值引用左值和右值的互换 小结 概述 左值和右值属于2中不同的表达式类型&#xff1b;它们在表达式中扮演不同的角色&#xff0c;特别是在赋值操作和函数参数传递中。 左值 定义&#xff1a;左值是指那些在内存中有确定位置的表达式&#xff0c;可以出…...

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…...

[深度学习] 卷积神经网络CNN

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理数据具有类似网格结构的神经网络&#xff0c;最常用于图像数据处理。 一、CNN的详细过程&#xff1a; 1. 输入层 输入层接收原始数据&#xff0c;例如一张图像&#xff0c;它可以被…...

区别QPushButton和QToolButton

在刚开始学习Qt时,可能很难理解QPushButton和QToolButton之间的区别。 QToolButton通常用于QToolBar中,常常只显示图标,而不显示文本。那么,它们的主要区别是什么?什么时候应该使用QPushButton,什么时候应该使用QToolButton? 了解这一点很重要,这样我们才能选择最合适…...

【Python】已解决:TypeError: Object of type JpegImageFile is not JSON serializable

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;TypeError: Object of type JpegImageFile is not JSON serializable 一、分析问题背景 在进行Python编程时&#xff0c;特别是处理图像数据和JSON序列化时&…...

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…...

Python面试宝典第1题:两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;找出数组中和为目标值的两个数的索引。可以假设每个输入只对应唯一的答案&#xff0c;且同样的元素不能被重复利用。比如&#xff1a;给定 nums [2, 7, 11, 15] 和 target 9&#xff0c;返回 [0, 1]&#xff0c;因…...

fastapi集成jwt

fastapi集成jwt fastapipython-jose实现jwt登录 1、安装相关包 python-jose pip install python-jose2、创建token及token校验 from copy import deepcopy from datetime import timedelta, datetimefrom jose import jwt, ExpiredSignatureErrorSECRET_KEY "xxx&quo…...

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…...

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说&#xff0c;从iOS设备恢复数据都是一项复杂的任务&#xff0c;因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到&#xff0c;例如分析…...

macOS 上或linux安装 Jenkins

在 macOS 上使用 Docker 安装 Jenkins 的步骤如下&#xff1a; 安装 Docker: 如果尚未安装 Docker&#xff0c;请先从 Docker 官网下载并安装 Docker Desktop for Mac。 打开终端: 打开 macOS 上的终端应用程序。 拉取 Jenkins 镜像: 使用以下命令从 Docker Hub 拉取 Jenkins…...

axios发送数据的几种方式

axios 发送数据的几种方式 1、最简单的方式是将参数直接拼接在 URL 上&#xff0c;这通常用于传递少量的数据&#xff0c;例如资源的 ID。 const id 12; axios.delete(https://api.example.com/${id}).then(response > {console.log(Resource deleted successfully:, res…...

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…...

离线安装kubesphere-详细操作,以及报错

离线安装kubesphere 官网地址 https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/air-gapped-installation/ 1.先准备docker环境 [rootnode1 ~]# tar -xf docker-24.0.6.tgz [rootnode1 ~]# ls anaconda-ks.cfg calico-v3.26.1.tar docker …...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...