windows API之GetDiskFreeSpaceEx
程序员文章站
2022-03-05 09:55:17
...
检测磁盘空间大小的API,原型:
GetDiskFreeSpaceExW(
_In_opt_ LPCWSTR lpDirectoryName,//磁盘名称
_Out_opt_ PULARGE_INTEGER lpFreeBytesAvailableToCaller,//可用空间
_Out_opt_ PULARGE_INTEGER lpTotalNumberOfBytes,//总空间
_Out_opt_ PULARGE_INTEGER lpTotalNumberOfFreeBytes//剩余空间
);
LARGE_INTEGER是一个结构体,有32位的高字节和32位的低字节,结构如下:
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
struct {
DWORD LowPart;
DWORD HighPart;
} u;
ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
参数以字节返回,换算为GB单位时可用
#define GB(x) (((x).HighPart << 2) + ((float)(x).LowPart) / 1024.0 / 1024.0 / 1024.0)
宏定义解析:2 10=1KB
2 20=1MB
2 30=1GB
ULARGE_INTEGER的高位是从第33位往上,而30位以上的都是GB,则高位的所有数据都是GB级别。
低位32位,最高的两位也是GB级别,为了数据的准确性,把这两位低位的数据加到高位上
则将高位左移两位,空出两个bit位正好低位的两个最高bit位填补。
剩下0位/1024/1024/1024可算出其余空间与高位相加,算出总空间。
使用范例:
1、轮询检测电脑各个磁盘
void CheckDeskInfo()
{
TCHAR buf[MAX_PATH] = {};
GetLogicalDriveStrings(MAX_PATH, buf);
TCHAR* pDrives = buf;
while (*pDrives != 0) {
if (GetDiskFreeSpaceEx(pDrives, &nFreeBytesAvailable, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))
{
TCHAR chBuf[256];
wsprintf(chBuf, _T("%I64d,总共%I64dG,剩余%I64dG/r/n"),
(nFreeBytesAvailable.QuadPart) / 1024 / 1024 / 1024, (nTotalNumberOfBytes.QuadPart) / 1024 / 1024 / 1024, (nTotalNumberOfFreeBytes.QuadPart) / 1024 / 1024 / 1024);
OutputDebugString(chBuf);
}
pDrives += wcslen(pDrives) + 1;
}
}
2、返回/提取具体数值接受数据的类型无法解析转换为普通数据类型,所以使用unsigned _int64这种方法,不会使数据丢失,我只使用free数据,所以只转换一个
int GetDeskFreeInfo()
{
unsigned _int64 nFreeBytesAvailable;
ULARGE_INTEGER nTotalNumberOfBytes;
uLARGE_INTEGER nTotalNumberOfFreeBytes;
int freespace = -1;
if (false == ::GetDiskFreeSpaceEx(L"C:", (ULARGE_INTEGER *)&nFreeBytesAvailable, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))
{
DWORD dError = ::GetLastError();
ZPPFileMgrHelper::postLog(pInstance, DOWNLOADMGR_LOG_LEVEL_LOG,
ZFunctions::PrintString("ZFileCacheManager::CheckDiskSpace error params: %s", params.c_str()));
freespace = -1;
}
freespace = nFreeBytesAvailable / 1024 / 1024;
return freespace;
}
下一篇: 威盛今日在沪公开分享多项自动驾驶实践技术
推荐阅读
-
JavaScript引用类型之Array类型API详解
-
微信小程序学习笔记之登录API与获取用户信息操作图文详解
-
优麒麟20.10发布:简单之美、兼容Windows有戏
-
RabbitMQ消息队列之Windows下安装和部署(一)
-
C#调用Windows API(示例:显示任务管理器里的程序名称)
-
Arcgis API for JavaScript学习笔记之Task(任务)的实例
-
HTML5实战与剖析之使用HTML5 WebSocket API
-
python调用windows api锁定计算机示例
-
html5编辑API之range对象(一)
-
API之Scanner,Random,ArrayList基础运用。重点是ArrayList