windows开发--QT主动监测U盘是否插入

关于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盘以及获取盘符等

猜你喜欢

转载自blog.csdn.net/PRML_MAN/article/details/113968276