前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GetDiskFreeSpaceEx函数的一点处理

GetDiskFreeSpaceEx函数的一点处理

作者头像
phith0n
发布2020-10-16 10:36:08
7930
发布2020-10-16 10:36:08
举报

GetDiskFreeSpaceEx函数的一点处理

GetDiskFreeSpaceEx()函数可以得到驱动器的簇信息,剩余空间以及总大小。

函数原型:

代码语言:javascript
复制
BOOL GetDiskFreeSpaceEx(
  LPCTSTR lpDirectoryName,            // directory name
  PULARGE_INTEGER lpFreeBytesAvailable,    // bytes available to caller
  PULARGE_INTEGER lpTotalNumberOfBytes,    // bytes on disk
  PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
);

函数的用法就不多讲了,讲一下PULARGE_INTEGER。我们这个函数得到的信息是磁盘的总大小、当前用户可操作大小、剩余磁盘空间,单位是字节。但是在我的电脑上int 以及 long int都是4个字节,也就是最大(无符号)能存是数2<sup>32</sup>字节,等于4G左右,显然已经不够了,现在随意一个分区就是几百G。所以这个函数用了一个特别的方法,即用一个联合,里面保存着一个结构体,而结构体里面有两个32位的整数,分别表示该数的上半部分和下半部分。于是就可以表示出一个64位的整数了。

在winnt.h中可以看到以下定义(省略了一部分):

代码语言:javascript
复制
typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

看到了吗,所以PULARGE_INTEGER其实指向的是这个联合,这个联合中的结构体中的LowPart表示低32位,HighPart表示高32位。

假如我们调用这个函数

代码语言:javascript
复制
GetDiskFreeSpaceEx(TEXT("D:"),&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNumberOfFreeBytes);

得到了TotalNumberOfBytes这个联合。里面便是D盘总大小,单位是字节。我们可以直接把他输出

代码语言:javascript
复制
printf("%I64d",TotalNumberOfBytes);

不过输出得到的是一大串数字(因为是以字节为单位),如果我们想以MB或GB为单位怎么办呢?直接拿TotalNumberOfBytes/1024/1024,发现编译会报错。你拿一个联合去和一个整数做除法运算,肯定报错。

所以我在这里给大家提供一个方法:

代码语言:javascript
复制
int iTotal = (TotalNumberOfBytes.u.HighPart << 12) + (TotalNumberOfBytes.u.LowPart >> 20);

什么意思?将高32位向左移12位,将低32位向右移20位,再相加,目的是什么?先看将LowPart向右移20位,剩下的其实就是LowPart的左12位。因为我们要得到以MB为单位,而1MB是2^20字节,所以只保留LowPart的左12位。而HighPart的所有位都应该保留,所以要放在第13位以后,故HighPart左移12位,最后相加。

得到的iTotal再想转换成GB就除以1024.0就可以了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GetDiskFreeSpaceEx函数的一点处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档