如何使用ULARGE_INTEGER执行arthemetic

时间:2017-10-17 15:46:51

标签: c++ c windows winapi

我有一个应用程序,我不断检查磁盘空间并将其与特定值进行比较。现在磁盘空间计算如下:

ULARGE_INTEGER p1;
ULARGE_INTEGER p2;
ULARGE_INTEGER p3;
GetDiskFreeSpaceEx(".", &p1, &p2, &p3); 

现在从上面的方法我得到变量p3中的空闲可用空间。现在我如何比较(算术运算)它与普通的整数值。此外,此代码必须在32位和64位平台上工作。或者,如果有任何其他选项来计算可用磁盘空间?谢谢

2 个答案:

答案 0 :(得分:3)

这假设您的程序针对的是Win SDK中定义ULARGE_INTEGER类型的Windows。

ULARGE_INTEGER是一个包含QuadPart成员的联合,该成员是整数的64位值。所以只需做一些事情:

if (p1.QuadPart < p2.QuadPart) ...

这也适用于32位版本,因为目前Win32的编译器已经支持64位整数类型(可能是从Win32开始以来)。

答案 1 :(得分:3)

ULARGE_INTEGER是在编译器具有本机64位类型之前,Windows API如何表示64位值。

今天,在使用Visual C ++编译器的Windows上,可以安全地在ULARGE_INTEGER*和64位本机类型(例如uint64_t*unsigned long long*)之间进行转换。

int compile_time_assert[(sizeof(ULARGE_INTEGER) == sizeof(unsigned long long)) ? 1 : -1];

unsigned long long freebytes = 0;
unsigned long long totalbytes = 0;
unsigned long long totalfree = 0;
GetDiskFreeSpaceEx(".", (ULARGE_INTEGER*)&freebytes, (ULARGE_INTEGER*)&totalbytes, (ULARGE_INTEGER*)&totalfree);

否则,如果你想避免演员hackery,你可以这样做:

ULARGE_INTEGER p1 = {0};
ULARGE_INTEGER p2 = {0};
ULARGE_INTEGER p3 = {0};
unsigned long long freebytes = 0;
unsigned long long totalbytes = 0;
unsigned long long totalfree = 0;
GetDiskFreeSpaceEx(".", &p1, &p2, &p3); 

freebytes = p1.QuadPart;
totalbytes = p2.QuadPart;
totalfree = p3.QuadPart;