如何确定驱动器是否是通过USB插入的外部驱动器?我检查了DriveInfo.DriveType,但是当我插入我的1TB外部驱动器时,它显示为固定驱动器。有什么想法吗?
根据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_LogicalDisk
和DriveInfo.DriveType
,会显示我的外部驱动器类型为'本地磁盘',我无法使用该信息来确定驱动器是否为外部驱动器。
我在寻找获取外部驱动器列表的方法时遇到了这个问题,发现可以通过更新语法来简化很多操作。此外,一些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;
}
drive.DriveFormat
。如果抛出IOException
异常,说明该驱动器无法被Windows读取,例如因为它被格式化为ext
。 - Corbie您可以使用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