判断磁盘类型(U盘,硬盘(移动硬盘还是电脑内置硬盘))

判断磁盘类型(U盘,硬盘(移动硬盘还是电脑内置硬盘))

// CheckMoveDisk.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>
#include <vector>
#include <string>
#include "AsStringUtil.h"
#include <stdio.h>

using namespace std;
using namespace Asiafly::Base;

BOOL GetDisksProperty(TCHAR *drive);
bool checkRemoveDisk(vector<LPTSTR>* drivePath);

int main()
{
	vector<LPTSTR>* drivePath;
	checkRemoveDisk(drivePath);
	system("pause");
	return 0;
}

bool checkRemoveDisk(vector<LPTSTR>* drivePath)   //参数存储所有移动盘的盘符
{
	bool flag = false;
	DWORD dw = GetLogicalDriveStrings(0, NULL);
	LPTSTR lpDriveStrings = (LPTSTR)HeapAlloc(GetProcessHeap(), 0, dw * sizeof(TCHAR));
	GetLogicalDriveStrings(dw, lpDriveStrings);      //获取盘符,字符串形式。
	do
	{
		UINT drivetype = GetDriveType(lpDriveStrings);   //获取驱动器类型
		if (drivetype == DRIVE_REMOVABLE)

			//驱动器类型为DRIVE_REMOVABLE,进一步获取卷信息,如果获取成功,则将盘符保存。
		{
			TCHAR szFileSNBuffer[512];
			DWORD dwFSystemFlags;
			//获取卷信息,如果获取成功,则说明已插入U盘。
			if (GetVolumeInformation(lpDriveStrings, NULL, 0, NULL, NULL, &dwFSystemFlags, szFileSNBuffer, 512))
			{
				//drivePath->push_back(lpDriveStrings);
				flag = true;
				std::cout << "U盘:" << AsStringUtil::ToString(lpDriveStrings) << std::endl;
			}
			
		}
		else 
		if (drivetype == DRIVE_FIXED)   //驱动器类型为DRIVE_FIXED,需要进一步判断是移动硬盘还是本地硬盘。
		{
			if (GetDisksProperty(lpDriveStrings) == TRUE)   //GetDisksProperty区分移动硬盘和本地硬盘,返回TRUE为移动硬盘.
			{
				//drivePath->push_back(lpDriveStrings);
				//flag = true;
				std::cout << "移动磁盘:" << AsStringUtil::ToString(lpDriveStrings)<<std::endl;
			}
			else
			{
				std::cout << "本地磁盘:" << AsStringUtil::ToString(lpDriveStrings) << std::endl;;
			}			
		}
		lpDriveStrings += (lstrlen(lpDriveStrings) + 1);
	} while (*lpDriveStrings != '\x00');
	return flag;
}

BOOL GetDisksProperty(TCHAR *drive)
{
	STORAGE_PROPERTY_QUERY Query;
	DWORD dwOutBytes;
	BOOL bResult;
	Query.PropertyId = StorageDeviceProperty;
	Query.QueryType = PropertyStandardQuery;
	std::string cstr(AsStringUtil::ToString(drive));
	cstr = "\\\\.\\" + cstr;
	cstr = cstr.substr(0, cstr.length()-1);
	HANDLE hDevice = CreateFile(
		AsStringUtil::ToWstring(cstr).c_str(), // 要打开的驱动器设备;格式必须为“\\.\C:”,否则打开失败,返回错误码2:系统找不到指定的文件。
		GENERIC_READ | GENERIC_WRITE,     // 访问权限
		FILE_SHARE_READ | FILE_SHARE_WRITE, //共享模式
		NULL,             // 使用默认的安全属性
		OPEN_EXISTING,    // 打开存在的设备
		NULL,
		NULL
	);
	if (hDevice == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	STORAGE_DESCRIPTOR_HEADER *pDevDescHeader;
	pDevDescHeader = (STORAGE_DESCRIPTOR_HEADER *)malloc(sizeof(STORAGE_DESCRIPTOR_HEADER));
	if (NULL == pDevDescHeader)
	{
		return FALSE;
	}
	bResult = DeviceIoControl(
		hDevice,     // 设备句柄
		IOCTL_STORAGE_QUERY_PROPERTY,     // 操作控制码
		&Query, sizeof Query,   //输入参数及缓冲区大小
		pDevDescHeader,     //输出参数
		sizeof(STORAGE_DESCRIPTOR_HEADER),  //输出参数的缓冲区大小
		&dwOutBytes,     //实际输出的大小
		NULL);
	if (!bResult)
	{
		free(pDevDescHeader);
		(void)CloseHandle(hDevice);
		return FALSE;
	}
	PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
	pDevDesc = (STORAGE_DEVICE_DESCRIPTOR *)malloc(pDevDescHeader->Size);
	bResult = DeviceIoControl(hDevice,
		IOCTL_STORAGE_QUERY_PROPERTY,
		&Query, sizeof Query,
		pDevDesc, pDevDescHeader->Size,
		&dwOutBytes,
		NULL);
	free(pDevDescHeader);
	(void)CloseHandle(hDevice);
	if (pDevDesc->BusType == BusTypeUsb)//总线类型为USB,返回TRUE
	{
		free(pDevDesc);
		return TRUE;
	}
	free(pDevDesc);
	return FALSE;
}

U盘插入判断:

U盘判断可以通过GetDriveType,如果是DRIVE_REMOVABLE类型则为U盘,但是在不能判断u盘是否插入。用GetVolumeInformation获取卷信息,如果获取到U盘信息说明U盘已经插入。

移动硬盘是否为内置的:

一般内置硬盘直连主板,读取速度比较快。外接硬盘以USB连接,读取速度比内置硬盘要慢的多。过总线类型判断是否USB接入,如果总线类型为USB则是移动硬盘

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值