首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何知道可移动磁盘是usb驱动器,还是sd卡?

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

Stack Overflow用户
提问于 2015-07-22 09:27:00
回答 2查看 3.8K关注 0票数 15

Windows 7平台,C#

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

代码语言:javascript
复制
DriveInfo[] drives = DriveInfo.GetDrives();

然后我可以使用DriveType查找所有可移动磁盘:

代码语言:javascript
复制
foreach (var drive in drives)
{
     if(drive.DriveType == DriveType.Removable)
         yield return drive;
}

现在我的问题是,SD卡磁盘和USB闪存盘共享相同的driveType:可移动,那么我如何才能找到USB闪存盘?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-22 10:16:55

您可以利用ManagementObjectSearcher来查询属于USB的磁盘驱动器,然后获取相应的单元字母,并只返回结果集中包含RootDirectory.NameDriveInfo

使用LINQ查询表达式的

代码语言:javascript
复制
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;
}

使用LINQ扩展方法的

代码语言:javascript
复制
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));
}

使用foreach的

代码语言:javascript
复制
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;
}

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

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

票数 7
EN

Stack Overflow用户

发布于 2015-07-22 09:36:39

我不得不在一个旧的项目中检查USB设备,然后像这样解决它:

代码语言:javascript
复制
 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*}

我得到GUID并检查设备GUID是否是USB。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31559121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档