GetDiskFreeSpaceEx() 原型如下:
[C++] 纯文本查看 复制代码 BOOL WINAPI GetDiskFreeSpaceEx(
__in_opt LPCTSTR lpDirectoryName,
__out_opt PULARGE_INTEGER lpFreeBytesAvailable,
__out_opt PULARGE_INTEGER lpTotalNumberOfBytes,
__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
该函数用来获得磁盘总空间和剩余空间,空间大小以字节表示,因为使用的是 DWORD64 数据类型,因此可以将很大的数据结果存入其中。DWORD64 (2^64 Byte)大约可以表示 16777216TB (2^64 / 2^40 = 2^24 TB)的数据量。
第 1 个参数 lpDirectoryName 可以是磁盘上的一个目录,一般指定磁盘分区的根路径名即可。
第 2 个参数 lpFreeBytesAvailable 用于存储可获得的总字节数。
第 3 个参数 lpTotalNumberOfBytes 用于存储磁盘空间总字节数据变量。
第 4 个参数 lpTotalNumberOfFreeBytes用于存储磁盘空闲空间的总字节。
第 2 个参数和第 4 个参数的区别是,磁盘上有的空间可能是预留给操作系统所用,而普通用户不能使用,第 2 个参数获得是用户实际可用的空闲空间,而第 4 个参数获得是所有的空闲空间。
函数中的第 2 个到第 4 个参数的类型是 ULARGE_INTEGER 指针,ULARGE_INTEGER 类型是个数据结构,定义如下:
[C++] 纯文本查看 复制代码 typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
} ;
struct {
DWORD LowPart;
DWORD HighPart;
} u;
ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
该数据结构使用两个 DWORD 来表示 64 位数据,低位存储在前,高位存储在后,与 DWORD64 的存储形式是一致的,所以也可以直接强制转换为 DWORD64 类型,也可以直接使用 QuadPart 成员,它是 ULONGLONG 数据类型,在 32 位机上,具有和 DWORD64 一样的长度。
测试代码:
[C++] 纯文本查看 复制代码 #include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "chs");
BOOL bResult;
DWORD64 qwFreeBytesAvailable, qwTotalNumberOfBytes, qwTotalNumberOfFreeBytes;
bResult = GetDiskFreeSpaceEx(argv[1], (PULARGE_INTEGER)&qwFreeBytesAvailable, (PULARGE_INTEGER)&qwTotalNumberOfBytes, (PULARGE_INTEGER)&qwTotalNumberOfFreeBytes);
if (bResult) {
_tprintf (TEXT("\n ==== %s 盘空间信息 ==== \n"), argv[1]);
_tprintf (TEXT("磁盘分区总容量:\t\t%.2f GB\n"), (double)(qwTotalNumberOfBytes /(1024*1024*1024)));
_tprintf (TEXT("可获得的空闲空间:\t\t%.2f GB\n"), (double)qwFreeBytesAvailable /(1024*1024*1024));
_tprintf (TEXT("总的空闲空间:\t\t%.2f GB\n"), (double)qwTotalNumberOfFreeBytes /(1024*1024*1024));
}
return 0;
}
运行输出:D:\WinAPI\DiskSpace\Debug>DiskSpace.exe D:\
==== D:\ 盘空间信息 ====
磁盘分区总容量: 468.00 GB
可获得的空闲空间: 353.85 GB
总的空闲空间: 353.85 GB
D:\WinAPI\DiskSpace\Debug>DiskSpace.exe E:\
==== E:\ 盘空间信息 ====
磁盘分区总容量: 340.00 GB
可获得的空闲空间: 86.28 GB
总的空闲空间: 86.28 GB ![]() ![]() |