Получить информацию об USB-устройство от Win32_DiskDrive и Win32_LogicalDisk


Я хочу знать информацию о USB-устройство от Win32_DiskDrive и Win32_LogicalDisk.

Я использую следующий код:

private void Add(string letter) // letter is a logical name of the USB device, e.g. "G:\\"
{
  foreach (var drive in new ManagementObjectSearcher("SELECT DeviceID, SerialNumber, Partitions FROM Win32_DiskDrive WHERE InterfaceType='USB'").Get())
  {
    var partition = new ManagementObjectSearcher(string.Format("ASSOCIATORS OF {{Win32_DiskDrive.DeviceID='{0}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition", drive["DeviceID"])).First();

    if (partition != null)
    {
      var logical = new ManagementObjectSearcher(string.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{0}'}} WHERE AssocClass = Win32_LogicalDiskToPartition", partition["DeviceID"])).First();

      if (logical != null)
      {
        var volume = new ManagementObjectSearcher(string.Format("SELECT Name, FreeSpace FROM Win32_LogicalDisk WHERE Name='{0}'", logical["Name"])).First();

        string name = (string)volume["Name"];
        string serialNumber = (string)drive["SerialNumber"];
        ulong freeSpace = (ulong)volume["FreeSpace"];
        break;
      }
    }
  }
}

  public static class WmiExtensions
  {
    // Fetch the first item from the search result collection.
        public static ManagementObject First(this ManagementObjectSearcher searcher)
        {
          ManagementObject result = null;
          foreach (ManagementObject item in searcher.Get())
          {
            result = item;
            break;
          }
          return result;
        }
      }
    }

Есть ли способ, чтобы сделать это короче и более элегантным?



964
5
задан 9 апреля 2018 в 01:04 Источник Поделиться
Комментарии
1 ответ

1: Add() не похоже, чтобы получить доступ к любым ученикам, поэтому он может быть объявлен static. Но опять же, похоже, хочет вернуть имя, серийный номер, и свободного пространства. Сделать это сделать это - создать тип быстрая контейнера

public sealed class DriveInfo
{
public DriveInfo(string name, string serialNumber, ulong freeSpace)
{
this.Name = name;
this.SerialNumber = serialNumber;
this.FreeSpace = freeSpace;
}

public string Name { get; }

public string SerialNumber { get; }

public ulong FreeSpace { get; }
}

использование становится:

return new DriveInfo(
(string)volume["Name"],
(string)drive["SerialNumber"],
(ulong)volume["FreeSpace"]);

2: параметр letter еще не полностью использованный в методе и комментарий-Это ложь. Удалить параметр и комментарий или используйте соответствующий параметр.

3: инвертировать if блоки, чтобы предотвратить так много отступов, а также учета тесты чистой (равенство и неравенство):

if (partition == null) continue;
...
if (logical == null) continue;

4: Как ManagementObject и ManagementObjectSearcher спуститься с Component, который реализует IDisposable. Жизни, следовательно, должны быть завернуты в using заявление:

using (var searcher = new ManagementObjectSearcher($"ASSOCIATORS OF {{Win32_DiskDrive.DeviceID='{drive["DeviceID"]}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition"))
using (var partition = searcher.First())
{
}

5: тело ваш метод расширения может быть заменен на быстрый один-лайнер:

return searcher.Get().Cast<ManagementObject>().FirstOrDefault();

3
ответ дан 9 апреля 2018 в 04:04 Источник Поделиться