获取分区和磁盘大小

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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值