在C ++中查找当前连接的USB存储路径 [英] Find current connected USB storage path in C++

查看:110
本文介绍了在C ++中查找当前连接的USB存储路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的环境:

Qt 5.3.1
Windows 10

我需要找到已安装的USB存储设备的路径. 通过该路径,我可以通过Qt复制文件. 我知道有一个跨平台的libusb.但是想知道任何简单的解决方案.

I need to find the path of mounted USB storage devices. Through the path, I can copy the files via Qt. I know there is a cross-platform libusb. But want to know any simple solution.

推荐答案

首先,您需要获得可移动驱动器:

First you need to get removable drives:

void EnumUsbDrives() {
    DWORD drv = ::GetLogicalDrives();
    if (drv == 0) return;

    DWORD mask = 1;
    TCHAR szDrive[] = _TEXT("?:\\");

    for (uint_t i = 0; i < ('Z' - 'A' + 1); i++, mask <<= 1) {
        if (drv & mask) {
            szDrive[0] = (TCHAR)(_T('A') + i);
            if (::GetDriveType(szDrive) == DRIVE_REMOVABLE) {
                bool bUSB = IsDriveUSB(szDrive);
                if (bUSB) {
                    // Time do to something useful
                }
            }
        }
    }
}

功能IsDriveUSB有点复杂.我已经从内部图书馆撕下它了;该函数使用自定义帮助程序类xregistry和xstring_nocase.它们的目的非常明显,我相信您可以很轻松地用其他类似的类或API调用来替换它.

Function IsDriveUSB is a bit more complicated. I have teared it from an in-house library; the function uses custom helper classes xregistry and xstring_nocase. Their purpose is pretty obvious, I believe you will have no trouble replacing it with other similar classes or API calls.

bool IsDriveUSB (LPCTSTR szDrive) throw() {
    TCHAR szLogicalDrive[] = _TEXT("\\\\.\\x:");
    szLogicalDrive[4] = szDrive[0];
    HANDLE hDrive = ::CreateFile(szLogicalDrive, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hDrive == INVALID_HANDLE_VALUE) return false;       // Can't open drive so we have to assume the drive is fixed

    VOLUME_DISK_EXTENTS vde;
    DWORD dwBytesReturned = 0;
    BOOL br = ::DeviceIoControl(hDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &vde, sizeof(vde), &dwBytesReturned, NULL);
    ::CloseHandle(hDrive);
    if (!br) return false;      // Can't get extents info so we have to assume the drive is fixed

    if (vde.NumberOfDiskExtents != 1) return false;
    ULONG uPhysDrive = vde.Extents[0].DiskNumber;
    TCHAR szPhysDrive[16];
    _stprintf(szPhysDrive, _TEXT("%u"), uPhysDrive);

    try {
        xregistry rk(HKEY_LOCAL_MACHINE, OS.Is64bit());
        rk.open(_TEXT("SYSTEM\\CurrentControlSet\\services\\Disk\\Enum"), KEY_QUERY_VALUE);
        if (!rk.value_exists(szPhysDrive)) return false;
        xstring_nocase strInterface = rk.get_string(szPhysDrive).substring(0, 7);
        return strInterface == _TEXT("USBSTOR");
    }
    catch (...) {
        return false;
    }
}

这篇关于在C ++中查找当前连接的USB存储路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆