在程序中,有时候需要区分移动硬盘和本地硬盘,U盘的检测比较简单,首先用GetLogicalDriveStrings获取盘符,然后用GetDriveType获取类型,返回结果为DRIVE_REMOVABLE,则为U盘。这里有个问题,就是如果电脑中存在可移动磁盘的盘符,却没有插入移动磁盘,这时候如果试图打开这个磁盘,系统会提示你插入磁盘。所以,应该在检测到类型为DRIVE_REMOVABLE之后,再使用GetVolumeInformation获取卷信息,如果获取成功,则说明该盘符已插入磁盘。
对于移动硬盘,使用GetDriveType返回的结果永远为DRIVE_FIXED,就是说系统将其与本地硬盘归为一类。那么,如何区分指定盘符是移动硬盘还是本地硬盘呢?
首先用CreateFile通过指定的盘符打开设备,返回设备句柄,然后用DeviceIoControl获取设备信息,通过总线类型判断是否USB接入,如果总线类型为USB则是移动硬盘。
代码如下:
bool CopyFileThread::checkRemoveDisk(vector<LPTSTR>* drivePath) //参数存储所有移动盘的盘符
{
bool flag=false;
DWORD dw=GetLogicalDriveStrings(0,NULL);
LPTSTR lpDriveStrings=(LPTSTR)HeapAlloc(GetProcessHeap(),0,dw*sizeof(TCHAR));
GetLogicalDriveStrings(dw,lpDriveStrings); //获取盘符,字符串形式。