Как найти букву USB-накопителя?


14

Я пишу программу установки для установки приложения на USB-накопитель. Приложение предназначено для использования только с USB-накопителей, поэтому он сохранит дополнительный шаг для пользователя, автоматически выбрав USB-накопитель для установки.

Я могу исследовать с помощью Nullsoft или MSI для установки, но так как я в основном знаком с .NET, я изначально планирую попробовать либо установить .NET-установщик, либо установить компонент на .NET.

Возможно ли определить букву диска флэш-накопителя USB в Windows с помощью .NET? Как?

  0

Выполняется ли сама программа с флеш-накопителя? Или вы просто пытаетесь сказать «эй, вот диски в системе, вот какие из них - флеш-накопители»? 23 сен. 082008-09-23 21:17:54

17

Вы могли бы использовать:

from driveInfo in DriveInfo.GetDrives() 
where driveInfo.DriveType == DriveType.Removable && driveInfo.IsReady 
select driveInfo.RootDirectory.FullName 
  0

Также получает диски FireWire, но на самом деле это действительно так. 12 ноя. 102010-11-12 16:13:03

+1

Но не возвращает жесткие диски USB, я думаю, что это проблема. 16 янв. 112011-01-16 12:34:37


15

Это будет перечислить все диски в системе без LINQ, но по-прежнему с помощью WMI:

// browse all USB WMI physical disks 

foreach(ManagementObject drive in new ManagementObjectSearcher(
    "select * from Win32_DiskDrive where InterfaceType='USB'").Get()) 
{ 
    // associate physical disks with partitions 

    foreach(ManagementObject partition in new ManagementObjectSearcher(
     "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"] 
      + "'} WHERE AssocClass = 
       Win32_DiskDriveToDiskPartition").Get()) 
    { 
     Console.WriteLine("Partition=" + partition["Name"]); 

     // associate partitions with logical disks (drive letter volumes) 

     foreach(ManagementObject disk in new ManagementObjectSearcher(
      "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" 
       + partition["DeviceID"] 
       + "'} WHERE AssocClass = 
       Win32_LogicalDiskToPartition").Get()) 
     { 
      Console.WriteLine("Disk=" + disk["Name"]); 
     } 
    } 

    // this may display nothing if the physical disk 

    // does not have a hardware serial number 

    Console.WriteLine("Serial=" 
    + new ManagementObject("Win32_PhysicalMedia.Tag='" 
    + drive["DeviceID"] + "'")["SerialNumber"]); 
} 

Source

  0

ManagementObject, ManagementObjectSearcher и ManagementObjectCollection (неявно извлеченные с помощью .Get()) имеют метод Dispose, который должен быть вызван. 02 ноя. 122012-11-02 09:50:29

+1

Я использовал ваше решение, чтобы найти букву диска с одним флеш-накопителем, о котором я знал серийный номер. Он хорошо работал под Windows 10, но в Windows 7 серийный номер пуст. Я понял, что серийный номер также является частью диска ["PNPDeviceID"], который я сейчас тестирую, если он содержит серийный номер, который я искал. Благодаря! 26 окт. 162016-10-26 12:08:51


14

C# 2.0 версия кода Кента (с верхней части головы, не проверены):

IList<String> fullNames = new List<String>(); 
foreach (DriveInfo driveInfo in DriveInfo.GetDrives()) { 
    if (driveInfo.DriveType == DriveType.Removable) { 
     fullNames.Add(driveInfo.RootDirectory.FullName); 
    } 
}