当前位置: 首页 > 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

http://www.lryc.cn/news/386447.html

相关文章:

  • 数据访问层如何提取数据到其他层,其他类中
  • 【JS】AI总结:JavaScript中常用的判空方法
  • Rust单元测试、集成测试
  • vue全局方法plugins/utils
  • 高阶算法班从入门到精通之路
  • C++ 左值右值
  • [数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别
  • [深度学习] 卷积神经网络CNN
  • 区别QPushButton和QToolButton
  • 【Python】已解决:TypeError: Object of type JpegImageFile is not JSON serializable
  • 超简单的nodejs使用log4js保存日志到本地(可直接复制使用)
  • Python面试宝典第1题:两数之和
  • fastapi集成jwt
  • 自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示
  • iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件
  • macOS 上或linux安装 Jenkins
  • axios发送数据的几种方式
  • 示例:WPF中推荐一个Diagram开源流程图控件
  • 离线安装kubesphere-详细操作,以及报错
  • Python Coala库:代码质量检查与自动化修复的利器
  • MyBatis(12)MyBatis 映射文件中的 resultMap
  • C语言从入门到进阶(15万字总结)
  • Java---Maven详解
  • 服务器日志事件ID4107:从自动更新 cab 中提取第三方的根目录列表失败,错误为: 已处理证书链,但是在不受信任提供程序信任的根证书中终止。
  • 【高级篇】MySQL集群与分布式:构建弹性和高效的数据服务(十四)
  • vue3 学习记录
  • spring boot jar 启动报错 Zip64 archives are not supported
  • BASH and SH in SHELL scripts
  • Qt Creator创建一个用户登录界面
  • 等保测评练习卷14