如何确定驱动器是外部驱动器

8
如何确定驱动器是否是通过USB插入的外部驱动器?我检查了DriveInfo.DriveType,但是当我插入我的1TB外部驱动器时,它显示为固定驱动器。有什么想法吗?

1
谷歌搜索把我带到了这里 - http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/a3d4dbc7-c63a-46d5-a191-c73a4fca233a/ - Hari Pachuveetil
你不能。通常情况下,无法从物理接口中推导出驱动器的物理位置。我有带有外部SATA驱动器和内部USB驱动器的系统。也许未来的驱动器将包括GPS。 - HABO
3个回答

6

根据Floyd Pink的评论,我使用了这个链接。这可以让我确定设备是否为外部设备。

public bool IsProjectOnExternalDisk(string driveLetter)
    {
        bool retVal = false;
        driveLetter = driveLetter.TrimEnd('\\');

        // browse all USB WMI physical disks
        foreach (ManagementObject drive in new ManagementObjectSearcher("select DeviceID, MediaType,InterfaceType from Win32_DiskDrive").Get())
        {
            // associate physical disks with partitions
            ManagementObjectCollection partitionCollection = new ManagementObjectSearcher(String.Format("associators of {{Win32_DiskDrive.DeviceID='{0}'}} " + "where AssocClass = Win32_DiskDriveToDiskPartition", drive["DeviceID"])).Get();

            foreach (ManagementObject partition in partitionCollection)
            {
                if (partition != null)
                {
                    // associate partitions with logical disks (drive letter volumes)
                    ManagementObjectCollection logicalCollection = new ManagementObjectSearcher(String.Format("associators of {{Win32_DiskPartition.DeviceID='{0}'}} " + "where AssocClass= Win32_LogicalDiskToPartition", partition["DeviceID"])).Get();

                    foreach (ManagementObject logical in logicalCollection)
                    {
                        if (logical != null)
                        {
                            // finally find the logical disk entry
                            ManagementObjectCollection.ManagementObjectEnumerator volumeEnumerator = new ManagementObjectSearcher(String.Format("select DeviceID from Win32_LogicalDisk " + "where Name='{0}'", logical["Name"])).Get().GetEnumerator();

                            volumeEnumerator.MoveNext();

                            ManagementObject volume = (ManagementObject)volumeEnumerator.Current;

                            if (driveLetter.ToLowerInvariant().Equals(volume["DeviceID"].ToString().ToLowerInvariant()) &&
                                (drive["MediaType"].ToString().ToLowerInvariant().Contains("external") || drive["InterfaceType"].ToString().ToLowerInvariant().Contains("usb")))
                            {
                                retVal = true;
                                break;
                            }
                        }
                    }
                }
            }
        }

        return retVal;
    }

在Royi Namir的回答中使用WMI Select * from Win32_LogicalDiskDriveInfo.DriveType,会显示我的外部驱动器类型为'本地磁盘',我无法使用该信息来确定驱动器是否为外部驱动器。


3

我在寻找获取外部驱动器列表的方法时遇到了这个问题,发现可以通过更新语法来简化很多操作。此外,一些USB驱动器是UAS或USB附加SCSI,这些类型的驱动器的接口实际上会显示为SCSI而不是USB。从我的测试中,我发现只需检查物理磁盘的介质类型中是否包含“外部”和“可移动”这两个术语就足够了。

Translated Answer:

我在寻找获取外部驱动器列表的方法时遇到了这个问题,发现可以通过更新语法来简化很多操作。此外,一些USB驱动器是UAS或USB附加SCSI,这些类型的驱动器的接口实际上会显示为SCSI而不是USB。从我的测试中,我发现只需检查物理磁盘的介质类型中是否包含“外部”和“可移动”这两个术语就足够了。

public List<DriveInfo> getExternalDrives()
{
    var drives = DriveInfo.GetDrives();
    var externalDrives = new List<DriveInfo>();

    var allPhysicalDisks = new ManagementObjectSearcher("select MediaType, DeviceID from Win32_DiskDrive").Get();

    foreach (var physicalDisk in allPhysicalDisks)
    {
        var allPartitionsOnPhysicalDisk = new ManagementObjectSearcher($"associators of {{Win32_DiskDrive.DeviceID='{physicalDisk["DeviceID"]}'}} where AssocClass = Win32_DiskDriveToDiskPartition").Get();
        foreach(var partition in allPartitionsOnPhysicalDisk)
        {
            if (partition == null)
                continue;

            var allLogicalDisksOnPartition = new ManagementObjectSearcher($"associators of {{Win32_DiskPartition.DeviceID='{partition["DeviceID"]}'}} where AssocClass = Win32_LogicalDiskToPartition").Get();
            foreach(var logicalDisk in allLogicalDisksOnPartition)
            {
                if (logicalDisk == null)
                    continue;

                var drive = drives.Where(x => x.Name.StartsWith(logicalDisk["Name"] as string, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                var mediaType = (physicalDisk["MediaType"] as string).ToLowerInvariant();
                if (mediaType.Contains("external") || mediaType.Contains("removable"))
                    externalDrives.Add(drive);
            }
        }
    }
    return externalDrives;
}

1
很棒的解决方案。它对我有用。我能够找到一个U盘,但是这段代码对于USB硬盘驱动器不起作用,然而我发现了你的解决方案,它对我有用。谢谢。 - Kaushikkumar Halvadia
我还会检查drive.DriveFormat。如果抛出IOException异常,说明该驱动器无法被Windows读取,例如因为它被格式化为ext - Corbie

3

您可以使用WMI技术。

Select * from Win32_LogicalDisk

这里有与本地、网络和映射驱动器相关的WMI服务的VBA使用信息。

 Select Case .DriveType
        Case 0
          strDriveType = "Unknown"
        Case 1
          strDriveType = "No Root Directory"
        Case 2
          strDriveType = "Removable Disk"
        Case 3
          strDriveType = "Local Disk"
        Case 4
          strDriveType = "Network Drive"
        Case 5
          strDriveType = "Compact Disc"
        Case 6
          strDriveType = "RAM Disk"
      End Select

2
这与DriveInfo.DriveType具有相同的结果,我的外部USB驱动器显示为DriveType 3或“本地磁盘”。 - Web

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接