void PrintVolumeSpaceInfo(TCHAR* szRoot)
{
_ULARGE_INTEGER lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes;
GetDiskFreeSpaceEx(szRoot, &lpFreeBytesAvailableToCaller, &lpTotalNumberOfBytes, &lpTotalNumberOfFreeBytes);
printf("分区总空间大小: %d MB\n",lpTotalNumberOfBytes.QuadPart / (1024 *1024));
printf("分区剩余空间大小: %d MB\n",lpTotalNumberOfFreeBytes.QuadPart / (1024 *1024));
printf("调用者可用的空间大小: %d MB\n",lpFreeBytesAvailableToCaller.QuadPart / (1024 *1024));
}
传入分区路径,打印出分区的大小信息。
GetDiskFreeSpaceEx只能获取分区的大小,不能获取整个磁盘的大小,也可以通过遍历所有分区然后加起来得到整个磁盘的大小。但是这种方法涉及很多细节要处理,
比如插入移动硬盘的情况,因为移动硬盘和硬盘在遍历得到的类型都是DRIVE_FIXED,所以不容易进行区分,还有就是分区被隐藏的话,有部分空间就计算不到了。
这个时候就需要 DeviceIoControl 来处理了。这个API是用于对磁盘进行一些直接操作的,比如获取硬盘序号和硬盘的存储信息,刷新硬盘文件系统缓存等你的
void PrintDiskSpaceInfo(CStringA szRoot)
{
DWORD dwDiskSize=0;
HANDLE hFile;
DISK_GEOMETRY dg;
hFile = CreateFileA(szRoot, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
if (hFile!=INVALID_HANDLE_VALUE && DeviceIoControl(
hFile,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&dg,
sizeof(dg),&dwDiskSize,NULL))
{
__int64 nCylinder = *(__int64*)&dg.Cylinders;
dwDiskSize = nCylinder*dg.TracksPerCylinder*dg.SectorsPerTrack*dg.BytesPerSector/1024/1024;
}
if (hFile!=INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
}
printf("分区总空间大小: %d MB\n", dwDiskSize);
}
这里的参数要传入磁盘的路径,比如说第一个磁盘"\\\\.\\PhysicalDrive0" 第二个"\\\\.\\PhysicalDrive1"