VC++获取磁盘相关信息

	char szLogicalDriveStrings[BUFSIZ];
	PCHAR szDrive;
	CString strError,strDiskCapacity;
	DWORD dwSectorsPerCluster,dwBytesPerSector,dwNumberOfFreeClusters,dwTotalNumberOfClusters;
	DWORD64 qwFreeBytesAvailable,qwFreeBytes,qwTotalBytes;

	ZeroMemory(szLogicalDriveStrings,BUFSIZ);
	//"C:\"、"D:\"、"E:\"
	//0x43 0x3a 0x5c 0x00 0x44 0x3a 0x5c 0x00 0x45 0x3a 0x5c 0x00 0x00
	GetLogicalDriveStrings(BUFSIZ-1,szLogicalDriveStrings);
	szDrive = (PCHAR)szLogicalDriveStrings;
	do {
		if(!GetDriverInfo(szDrive))
		{
			m_ctrlDisplay.SetSel(-1,-1);
			strError.Format(_T("%s %d\r\n"),"Get Volume Information Error:",GetLastError());
			m_ctrlDisplay.ReplaceSel(strError);
		}
		if(GetDiskFreeSpace(szDrive,&dwSectorsPerCluster,&dwBytesPerSector,&dwNumberOfFreeClusters,&dwTotalNumberOfClusters))
		{
			strDiskCapacity.Format(_T("%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %I64d\r\n%s %I64d\r\n"),
				"Number of Free Clusters:\t\t",dwNumberOfFreeClusters,"Total Number of Clusters:\t\t",dwTotalNumberOfClusters,
				"Sectors Per Cluster:\t\t",dwSectorsPerCluster,"Bytes Per Sector:\t\t",dwBytesPerSector,
				"Free Space(Byte):\t\t",(DWORD64)dwNumberOfFreeClusters*(DWORD64)dwSectorsPerCluster*(DWORD64)dwBytesPerSector,
				"Total Space(Byte):\t\t",(DWORD64)dwTotalNumberOfClusters*(DWORD64)dwSectorsPerCluster*(DWORD64)dwBytesPerSector);
			m_ctrlDisplay.SetSel(-1,-1);
			m_ctrlDisplay.ReplaceSel(strDiskCapacity);
		}
		if(GetDiskFreeSpaceEx(szDrive,(PULARGE_INTEGER)&qwFreeBytesAvailable,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes))
		{
			strDiskCapacity.Format(_T("%s %I64d\r\n%s %I64d\r\n%s %I64d\r\n"),"Free Bytes Available:\t\t",qwFreeBytesAvailable,
				"Free Space(Byte):\t\t",qwFreeBytes,"Total Space(Byte):\t\t",qwTotalBytes);
			m_ctrlDisplay.SetSel(-1,-1);
			m_ctrlDisplay.ReplaceSel(strDiskCapacity);
		}
		szDrive += (lstrlen(szDrive)+1);
	} while(*szDrive != '\x00');


BOOL GetDriverInfo(LPSTR szDrive)
{
	UINT uDriveType;
	DWORD dwVolumeSerialNumber;
	DWORD dwMaximunComponentLength;
	DWORD dwFileSystemFlags;
	DWORD dwLastError;
	CHAR szFileSystemNameBuffer[BUFSIZ];
	CHAR szDriveName[MAX_PATH];
	CString strDriveTypeInfo,strTemp;

	m_ctrlDisplay.SetSel(-1,-1);
	m_ctrlDisplay.ReplaceSel(szDrive);
	m_ctrlDisplay.SetSel(-1,-1);
	m_ctrlDisplay.ReplaceSel("\r\n");
	uDriveType = GetDriveType(szDrive);
	switch(uDriveType)
	{
	case DRIVE_UNKNOWN:
		strDriveTypeInfo = "The drive type cannot be determined.";
		break;
	case DRIVE_NO_ROOT_DIR:
		strDriveTypeInfo = "The root path is invalid, for example, no volume is mounted at the path.";
		break;
	case DRIVE_REMOVABLE:
		strDriveTypeInfo = "The drive is a type that has removable media, for example, a floppy drive or removable hard disk.";
		break;
	case DRIVE_FIXED:
		strDriveTypeInfo = "The drive is a type that cannot be removed,for example, a fixed hard drive.";
		break;
	case DRIVE_REMOTE:
		strDriveTypeInfo = "The drive is a remote (network) drive.";
		break;
	case DRIVE_CDROM:
		strDriveTypeInfo = "The drive is a CD-ROM drive.";
		break;
	case DRIVE_RAMDISK:
		strDriveTypeInfo = "The drive is a RAM disk.";
		break;
	default:
		break;
	}
	m_ctrlDisplay.SetSel(-1,-1);
	m_ctrlDisplay.ReplaceSel(strDriveTypeInfo);
	//驱动器名、驱动器序列号、文件系统所支持的文件组成部分的最大值、驱动器属性值、文件系统类型
	//lpRootPathName:可以为NULL,则使用当前使用目录的根。如为一个UNC名字,则必须在其后添加一个反斜杠(\)。UNC是通用命名规则
	//lpFileSystemFlags:
	//FS_CASE_IS_PRESERVED文件系统保护给一个磁盘命名的文件名情况
	//FS_CASE_SENSITIVE文件系统支持区分大小写的文件名
	//FS_UNICODE_STORED_ON_DISK文件系统出现在磁盘中的文件名Unicode
	//FS_PERSISTENT_ACLS文件系统维护和实施ACLs,如NTFS维护和实施ACLs,但FAT不能
	//FS_FILE_COMPRESSION文件系统支持基于文件的压缩
	//FS_VOL_IS_COMPRESSED指定的卷是一个压缩卷,如一个DoubleSpace卷
	//FILE_SUPPORTS_ENCRYPTION表示文件系统是否支持EFS加密
	//FILE_SUPPORTS_OBJECT_IDS文件系统支持对象标识符
	//FILE_SUPPORTS_REPARSE_POINTS文件系统支持再分析点
	//FILE_SUPPORTS_SPARSE_FILES文件系统支持稀疏文件
	//FILE_VOLUME_QUOTAS文件系统支持磁盘限额
	if(!GetVolumeInformation(szDrive,szDriveName,MAX_PATH,&dwVolumeSerialNumber,&dwMaximunComponentLength,&dwFileSystemFlags,szFileSystemNameBuffer,BUFSIZ))
	{
		dwLastError = GetLastError();
		if(dwLastError == 21)
		{
			m_ctrlDisplay.SetSel(-1,-1);
			m_ctrlDisplay.ReplaceSel("The device is not ready. Please insert CD.\r\n");
		}
		return FALSE;
	}

	if(0 != lstrlen(szDriveName))
	{
		m_ctrlDisplay.SetSel(-1,-1);
		strTemp.Format(_T("%s %s"),"Drive name is",szDriveName);
		m_ctrlDisplay.ReplaceSel(strTemp + "\r\n");
	}
	strTemp.Format(_T("%s %u\r\n%s %u\r\n%s %s\r\n"),"Volume Serial Number is",dwVolumeSerialNumber,"Maximum Component Length is",dwMaximunComponentLength,"System Type is",szFileSystemNameBuffer);
	m_ctrlDisplay.SetSel(-1,-1);
	m_ctrlDisplay.ReplaceSel(strTemp);
	
	if(dwFileSystemFlags & FILE_VOLUME_QUOTAS)
	{
		m_ctrlDisplay.SetSel(-1,-1);
		m_ctrlDisplay.ReplaceSel("The file system supports disk quotas.\r\n");
	}
	return TRUE;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值