关于U盘的监测有两种方式,一种是主动监测,另一种是U盘插拔时被动接收事件并处理,两种不同的方式使用场景不同。本文主要介绍在windows系统下主动监测U盘的方法。
接口介绍
该方法主要调用Windows.h头文件中的相应接口函数:
1、GetLogicalDriveStrings() 获取相关磁盘的磁盘号
原型: WINBASEAPI DWORD WINAPI GetLogicalDriveStringsW (DWORD nBufferLength, LPWSTR lpBuffer);
其中lpBuffer的数据格式为: A:\NULLB:\NULLC:\NULL 每个磁盘名称占用4个字节
2、GetDriveType() 根据磁盘名判断磁盘类型,用来区分是否是U盘
原型: WINBASEAPI UINT WINAPI GetDriveTypeW (LPCWSTR lpRootPathName);
实现原理
获取所有的磁盘名称,针对每个磁盘获取对应的类型,判断是否是U盘。
代码
#include <Windows.h>
#include <fileapi.h>
#include <qdebug.h>
void diskDetect()
{
// 获取磁盘字符串总长度 stringLen
size_t stringLen = GetLogicalDriveStrings(0, NULL);
size_t diskNameLen = 4;
size_t diskNum = stringLen / diskNameLen;
char *drvString = new char[stringLen];
// 获取磁盘字符串并保存到 drvString
GetLogicalDriveStrings(stringLen, (LPTSTR)drvString); // drvString内部保存的数据是A:\NULLB:\NULLC:\NULL
for (size_t i = 0; i < diskNum ; ++i) {
char dir[] = {
drvString[i * diskNameLen],':','\\' };
size_t diskType = GetDriveType((LPCWSTR)(drvString + i * diskNameLen));
if (diskType == DRIVE_REMOVABLE) {
qDebug()<<"find disk is :"<<dir[0]<<endl;
return ;
}
}
qDebug()<<"Not found Any UDisk\n";
}
int main(int argc, char *argv[])
{
diskDetect();
int a;
scanf("%d", &a); // 阻塞程序结束
return 0;
}
相关链接
[1] 教程二:windows api(c mfc vs2017)实现U盘插拔检测,获取U盘容量,U盘内容移动,开启和关闭U盘以及获取盘符等