2010-12-09 14 views
17

Dada la letra de una unidad, ¿cómo puedo determinar qué tipo de unidad es?¿Cómo puedo determinar si una letra de unidad determinada es una unidad local, asignada o USB?

Por ejemplo, si E: \ es una unidad USB, una unidad de red o un disco duro local.

+1

"El título lo dice todo" - no, doesn; t. ¿En qué idioma/SO estás? ¿Necesita detectar una unidad USB conectada, etc. etc – Jamiec

+3

@Jamiec - Creo que en este caso sí lo hizo. Mire sus etiquetas: C#, significa que está usando C# .Net, .Net significa que está usando Windows (muy probablemente), y su título de pregunta claramente indica que quiere saber qué tipo de unidad es una letra de unidad. De todos modos, edité la pregunta. – GenericTypeTea

+2

@Jamiec, la pregunta 'detectar USB drive enchufado' ya ha sido aplastada hasta la muerte aquí en SO;) – Benjol

Respuesta

31

Eche un vistazo a DriveInfo 's DriveType propiedad.

System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives(); 
foreach (var drive in drives) 
{ 
    string driveName = drive.Name; // C:\, E:\, etc:\ 

    System.IO.DriveType driveType = drive.DriveType; 
    switch (driveType) 
    { 
     case System.IO.DriveType.CDRom: 
      break; 
     case System.IO.DriveType.Fixed: 
      // Local Drive 
      break; 
     case System.IO.DriveType.Network: 
      // Mapped Drive 
      break; 
     case System.IO.DriveType.NoRootDirectory: 
      break; 
     case System.IO.DriveType.Ram: 
      break; 
     case System.IO.DriveType.Removable: 
      // Usually a USB Drive 
      break; 
     case System.IO.DriveType.Unknown: 
      break; 
    } 
} 
+0

Gracias, justo lo que necesitaba para apuntarme en la dirección correcta. – Benjol

+1

¡Eso es exactamente lo que necesito para mi proyecto! Muchas gracias ! – Shinichi

+0

Esto no funcionará siempre (Principalmente para discos duros externos). Intenta ver si el tipo de interfaz es USB. –

6

Sólo como referencia para cualquier otra persona, esto es lo que me di la respuesta de GenericTypeTea en:

/// <summary> 
/// Gets the drive type of the given path. 
/// </summary> 
/// <param name="path">The path.</param> 
/// <returns>DriveType of path</returns> 
public static DriveType GetPathDriveType(string path) 
{ 
    //OK, so UNC paths aren't 'drives', but this is still handy 
    if(path.StartsWith(@"\\")) return DriveType.Network; 
    var info = 
      DriveInfo.GetDrives() 
      Where(i => path.StartsWith(i.Name, StringComparison.OrdinalIgnoreCase)) 
      FirstOrDefault(); 
    if(info == null) return DriveType.Unknown; 
    return info.DriveType; 
} 

(Es posible que desee también tomar nota de AJ Bauer's answer: DriveInfo también mostrará USB HD como DriveType.fixed)

+0

Muestra agradable, pero modificaría la línea a 'path.StartsWith (i.Name, StringComparison.OrdinalIgnoreCase)' para que no distinga entre mayúsculas y minúsculas. – DeCaf

+0

@DeCaf, acabo de notar su comentario, ¡gracias! – Benjol

+0

@vlax, gracias, lo siento, fue rechazado ... – Benjol

3

DriveInfo también mostrará HD de USB como DriveType.fixed, por lo que esto no ayuda si necesita saber si la interfaz de una unidad es USB o no. Aquí es una función que devuelve VB.NET todas las letras de las unidades USB externas:

Imports System.Management 

Public Shared Function GetExternalUSBDriveLettersCommaSeparated() As String 
    Dim usbDrivesString As String = "" 

    Dim wmiDiskDriveDeviceID As String = "" 
    Dim wmiDiskDriveMediaType As String = "" 
    Dim wmiDiskPartitionDeviceID As String = "" 
    Dim wmiLogicalDiskDeviceID As String = "" 

    Using wmiDiskDrives = New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'") 
     For Each wmiDiskDrive As ManagementObject In wmiDiskDrives.Get 
      wmiDiskDriveDeviceID = wmiDiskDrive("DeviceID").ToString 
      wmiDiskDriveMediaType = wmiDiskDrive("MediaType").ToString.ToLower 
      If wmiDiskDriveMediaType.Contains("external") Then 
       Using wmiDiskPartitions = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + wmiDiskDriveDeviceID + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition") 
        For Each wmiDiskPartition As ManagementObject In wmiDiskPartitions.Get 
         wmiDiskPartitionDeviceID = wmiDiskPartition("DeviceID").ToString 
         Using wmiLogicalDisks = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + wmiDiskPartitionDeviceID + "'} WHERE AssocClass = Win32_LogicalDiskToPartition") 
          For Each wmiLogicalDisk As ManagementObject In wmiLogicalDisks.Get 
           wmiLogicalDiskDeviceID = wmiLogicalDisk("DeviceID").ToString 
           If usbDrivesString = "" Then 
            usbDrivesString = wmiLogicalDiskDeviceID 
           Else 
            usbDrivesString += "," + wmiLogicalDiskDeviceID 
           End If 
          Next 
         End Using 
        Next 
       End Using 
      End If 
     Next 
    End Using 

    Return usbDrivesString 
End Function 

ve este enlace de MSDN: WMI Tasks: Disks and File Systems

Cuestiones relacionadas