1,涉及的API
GetDiskFreeSpaceEx,声明如下:
WINBASEAPI
BOOL
WINAPI
GetDiskFreeSpaceExA(
__in_opt LPCSTR lpDirectoryName,
__out_opt PULARGE_INTEGER lpFreeBytesAvailableToCaller,
__out_opt PULARGE_INTEGER lpTotalNumberOfBytes,
__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
WINBASEAPI
BOOL
WINAPI
GetDiskFreeSpaceExW(
__in_opt LPCWSTR lpDirectoryName,
__out_opt PULARGE_INTEGER lpFreeBytesAvailableToCaller,
__out_opt PULARGE_INTEGER lpTotalNumberOfBytes,
__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
#ifdef UNICODE
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExW
#else
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA
#endif // !UNICODE
参数说明:
lpDirectoryName是驱动器的名称。注意需要传入"C:","D:"形式的名称。
lpFreeBytesAvailableToCaller 接收用户可用的磁盘空间。
lpTotalNumberOfBytes 接收磁盘总共的空间。
lpTotalNumberOfFreeBytes 接收磁盘空闲的空间。
以上都是字节为单位。
2,使用
这里我们获取一个GB为单位的的浮点数磁盘大小。
FLOAT GetDiskFreeSpaceAsGB(WCHAR cDiskName)
{
FLOAT fFreeSpaceAsGB = 0.0f;
ULARGE_INTEGER uiFreeBytesAvailableToCaller;
ULARGE_INTEGER uiTotalNumberOfBytes;
ULARGE_INTEGER uiTotalNumberOfFreeBytes;
WCHAR szPath[2] = {0};
swprintf(szPath,L"%c:",cDiskName);
if(GetDiskFreeSpaceExW(szPath,
&uiFreeBytesAvailableToCaller,
&uiTotalNumberOfBytes,
&uiTotalNumberOfFreeBytes))
{
fFreeSpaceAsGB = (FLOAT)((LONGLONG)(uiFreeBytesAvailableToCaller.QuadPart)/1024.0f/1024.0f/1024.f);
}
return fFreeSpaceAsGB;
}
同样的,获取总空间大小,就使用uiTotalNumberOfBytes这个值就可以了。
3,效果