Obtenga información sobre el dispositivo USB de win32_diskdrive y win32_logicaldisk -- # campo con wmi-query camp codereview Relacionados El problema

Get information about the USB device from Win32_DiskDrive and Win32_LogicalDisk


5
vote

problema

Español

Quiero saber la información sobre un dispositivo USB de win32_diskdrive y win32_logicaldisk.

Yo uso el siguiente código:

  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;         }       }     }   

¿Hay alguna manera de hacerlo más corto y más elegante?

Original en ingles

I want to know the information about a USB device from Win32_DiskDrive and Win32_LogicalDisk.

I use the following code:

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;         }       }     } 

Is there a way to make it shorter and more elegant?

     
     
     

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

1: Add() no parece acceder a ningún miembro de la clase, por lo que se puede declarar static . Pero, de nuevo, parece que quiere devolver el nombre, el número de serie y el espacio libre. Hágalo hacerlo, cree un tipo de contenedor rápido

  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; } }   

El uso se convierte en:

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

2: El parámetro letter está completamente no utilizado en el método y el comentario es una mentira. Retire el parámetro y comente o use el parámetro de manera adecuada.

3: Invertir su if bloques, para evitar tanta indición, así como mantener las pruebas que buscan limpiador (igualdad frente a la no igualdad):

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

4: ambos ManagementObject y ManagementObjectSearcher8 Desciende de Component , que implementa static0 . Por lo tanto, su vida, por lo tanto, debe envolverse en un extracto static1 :

  static2  

5: El cuerpo de su método de extensión puede ser reemplazado por un forro rápido:

static3

 

1: Add() doesn't appear to access any class members, so it can be declared static. But then again, it looks like it wants to return the name, serial number, and free space. Make it do so - create a quick container type

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; } } 

usage becomes:

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

2: The parameter letter is completely unused in the method and the comment is a lie. Remove the parameter and comment or use the parameter appropriately.

3: Invert your if blocks, to prevent so much indention as well as keeping the tests looking cleaner (equality vs. non-equality):

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

4: Both ManagementObject and ManagementObjectSearcher descend from Component, which implements IDisposable. Their lifetime should therefore be wrapped in a using statement:

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

5: Your extension method's body can be replaced by a quick one-liner:

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

 
 

Relacionados problema

5  Obtenga información sobre el dispositivo USB de win32_diskdrive y win32_logicaldisk  ( Get information about the usb device from win32 diskdrive and win32 logicaldisk ) 
Quiero saber la información sobre un dispositivo USB de win32_diskdrive y win32_logicaldisk. Yo uso el siguiente código: private void Add(string lett...

2  Personajes de escape en una consulta de WMI  ( Escaping characters in a wmi query ) 
He eliminado este código para permitirme consultar para nombres de servicio específicos usando PowerShell. Estoy después del ejecutable ( PathName1 ) para e...

2  Buscando acciones coincidentes  ( Searching for matching shares ) 
Estamos trabajando en algún código que implica validar ciertos rutas UNC (buscando específicamente cosas que parecen ser subdirectorias de otras cosas), y hem...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos