C# как узнать, является ли съемный диск USB-накопителем или SD-картой?
Платформа Windows 7, C#
Я использую следующее утверждение, чтобы перечислить все диски:
DriveInfo[] drives = DriveInfo.GetDrives();
тогда я могу использовать DriveType, чтобы узнать все эти съемные диски:
foreach (var drive in drives)
{
if(drive.DriveType == DriveType.Removable)
yield return drive;
}
Теперь моя проблема заключается в том, что диск SD-карты и флэш-диск USB совместно используют один и тот же тип накопителя. Съемный, так как я могу найти только флэш-диск USB?
Спасибо!
2 ответа
Вы можете воспользоваться ManagementObjectSearcher
использовать его для запроса дисков USB, затем получить соответствующую букву устройства и вернуть только DriveInfo
из которых RootDirectory.Name
содержится в наборе результатов.
Использование выражений запросов LINQ:
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:
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:
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-карты, но я надеюсь, что это поможет
Мне пришлось проверить USB-устройства в старом проекте и решить это так:
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-GUID.