C# C如何知道可移动磁盘是usb驱动器还是sd卡?

C# C如何知道可移动磁盘是usb驱动器还是sd卡?,c#,removable,C#,Removable,Windows7平台,C 我使用以下语句列出所有驱动器: DriveInfo[] drives = DriveInfo.GetDrives(); 然后我可以使用DriveType查找所有这些可移动磁盘: foreach (var drive in drives) { if(drive.DriveType == DriveType.Removable) yield return drive; } 现在我的问题是,SD卡磁盘和USB闪存盘共享相同的驱动器类型:可移动,

Windows7平台,C

我使用以下语句列出所有驱动器:

DriveInfo[] drives = DriveInfo.GetDrives();
然后我可以使用DriveType查找所有这些可移动磁盘:

foreach (var drive in drives)
{
     if(drive.DriveType == DriveType.Removable)
         yield return drive;
}
现在我的问题是,SD卡磁盘和USB闪存盘共享相同的驱动器类型:可移动,那么我如何才能只找到USB闪存盘


谢谢

我不得不在一个旧项目中检查USB设备,并这样解决:

我获取GUID并检查设备GUID是否为USB-GUID。

您可以利用ManagementObjectSearcher使用它查询USB磁盘驱动器,然后获取相应的单位字母,并仅返回根目录中包含名称的驱动器信息

使用LINQ查询表达式:

使用LINQ扩展方法:

使用foreach:

要使用ManagementObject,您需要添加对System.Management的引用


我没有很好地测试它,因为现在我没有任何SD卡,但我希望它有帮助

我不完全确定,但我认为OP没有GUIDalso谢谢你的npit,但我关注的是Codropo的答案,很抱歉没有尝试你的。hi@Codropo,usbDrivesLetters返回所有可移动驱动器,包括SD卡。但是我喜欢ManagementObjectSearcher,它看起来更专业,哈哈,所以你能帮我一点忙吗?如何只过滤usb驱动器?@OhMyDog In Device manager,SD卡读卡器显示在哪个节点下?@OhMyDog您还可以告诉我从Win32\U DiskDrive中InterfaceType='USB'.Get.Cast.Selectf=>stringf[PNPDeviceID].ToList新ManagementObjectSearcherselect*的输出是什么吗?问题已解决。我检查了pnpDeviceID,发现USB闪存和SD卡之间存在差异,谢谢!在你现在知道怎么做之后,你能把你的答案编辑成正确的吗?谢谢
 Win32.DEV_BROADCAST_DEVICEINTERFACE deviceInterface;
 deviceInterface = (Win32.DEV_BROADCAST_DEVICEINTERFACE)
 string name = new string(deviceInterface.dbcc_name);
 Guid g = new Guid(deviceInterface.dbcc_classguid);
 if (g.ToString() == "a5dcbf10-6530-11d2-901f-00c04fb951ed")
 {*DO SOMETHING*}
static IEnumerable<DriveInfo> GetUsbDevices()
{
    IEnumerable<string> usbDrivesLetters = from drive in new ManagementObjectSearcher("select * from Win32_DiskDrive WHERE InterfaceType='USB'").Get().Cast<ManagementObject>()
                                           from o in drive.GetRelated("Win32_DiskPartition").Cast<ManagementObject>()
                                           from i in o.GetRelated("Win32_LogicalDisk").Cast<ManagementObject>()
                                           select string.Format("{0}\\", i["Name"]);

    return from drive in DriveInfo.GetDrives()
           where drive.DriveType == DriveType.Removable && usbDrivesLetters.Contains(drive.RootDirectory.Name)
           select drive;
}
static IEnumerable<DriveInfo> GetUsbDevices()
{
    IEnumerable<string> usbDrivesLetters = new ManagementObjectSearcher("select * from Win32_DiskDrive WHERE InterfaceType='USB'").Get().Cast<ManagementObject>()
        .SelectMany(drive => drive.GetRelated("Win32_DiskPartition").Cast<ManagementObject>())
        .SelectMany(o => o.GetRelated("Win32_LogicalDisk").Cast<ManagementObject>())
        .Select(i => Convert.ToString(i["Name"]) + "\\");

    return DriveInfo.GetDrives().Where(drive => drive.DriveType == DriveType.Removable && usbDrivesLetters.Contains(drive.RootDirectory.Name));
}
static IEnumerable<string> GetUsbDrivesLetters()
{                
    foreach (ManagementObject drive in new ManagementObjectSearcher("select * from Win32_DiskDrive WHERE InterfaceType='USB'").Get())
        foreach (ManagementObject o in drive.GetRelated("Win32_DiskPartition"))
            foreach (ManagementObject i in o.GetRelated("Win32_LogicalDisk"))
                yield return string.Format("{0}\\", i["Name"]);
}

static IEnumerable<DriveInfo> GetUsbDevices()
{
    IEnumerable<string> usbDrivesLetters = GetUsbDrivesLetters();
    foreach (DriveInfo drive in DriveInfo.GetDrives())
        if (drive.DriveType == DriveType.Removable && usbDrivesLetters.Contains(drive.RootDirectory.Name))
            yield return drive;
}