2012-03-27 16 views
3

Wie kann ich feststellen, ob es sich bei einem Laufwerk um ein über USB angeschlossenes externes Laufwerk handelt? Ich überprüfte die DriveInfo.DriveType, aber mit meinem 1TB externen Laufwerk über USB angeschlossen zeigt es sich als ein festes Laufwerk.So ermitteln Sie, ob das Laufwerk ein externes Laufwerk ist

Gedanken?

+1

Googeln nahm mich hier - http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/a3d4dbc7-c63a-46d5-a191-c73a4fca233a/ –

+0

Sie können nicht. Der physische Standort eines Laufwerks kann im Allgemeinen nicht von der physischen Schnittstelle abgeleitet werden. Ich habe Systeme mit externen SATA-Laufwerken und internen USB-Laufwerken. Vielleicht werden zukünftige Laufwerke GPS enthalten. – HABO

Antwort

4

Basierend auf einem Kommentar von Floyd Rosa ich diesen link verwendet. Dadurch kann ich feststellen, ob ein Gerät extern ist oder nicht.

public bool IsProjectOnExternalDisk(string driveLetter) 
    { 
     bool retVal = false; 
     driveLetter = driveLetter.TrimEnd('\\'); 

     // browse all USB WMI physical disks 
     foreach (ManagementObject drive in new ManagementObjectSearcher("select DeviceID, MediaType,InterfaceType from Win32_DiskDrive").Get()) 
     { 
      // associate physical disks with partitions 
      ManagementObjectCollection partitionCollection = new ManagementObjectSearcher(String.Format("associators of {{Win32_DiskDrive.DeviceID='{0}'}} " + "where AssocClass = Win32_DiskDriveToDiskPartition", drive["DeviceID"])).Get(); 

      foreach (ManagementObject partition in partitionCollection) 
      { 
       if (partition != null) 
       { 
        // associate partitions with logical disks (drive letter volumes) 
        ManagementObjectCollection logicalCollection = new ManagementObjectSearcher(String.Format("associators of {{Win32_DiskPartition.DeviceID='{0}'}} " + "where AssocClass= Win32_LogicalDiskToPartition", partition["DeviceID"])).Get(); 

        foreach (ManagementObject logical in logicalCollection) 
        { 
         if (logical != null) 
         { 
          // finally find the logical disk entry 
          ManagementObjectCollection.ManagementObjectEnumerator volumeEnumerator = new ManagementObjectSearcher(String.Format("select DeviceID from Win32_LogicalDisk " + "where Name='{0}'", logical["Name"])).Get().GetEnumerator(); 

          volumeEnumerator.MoveNext(); 

          ManagementObject volume = (ManagementObject)volumeEnumerator.Current; 

          if (driveLetter.ToLowerInvariant().Equals(volume["DeviceID"].ToString().ToLowerInvariant()) && 
           (drive["MediaType"].ToString().ToLowerInvariant().Contains("external") || drive["InterfaceType"].ToString().ToLowerInvariant().Contains("usb"))) 
          { 
           retVal = true; 
           break; 
          } 
         } 
        } 
       } 
      } 
     } 

     return retVal; 
    } 

Mit WMI Select * from Win32_LogicalDisk wie in Royi Namir Antwort und DriveInfo.DriveType zeigen meinen externen Typen als ‚Lokaler Datenträger‘, die ich nicht, ob das Laufwerk extern ist verwenden kann, zu bestimmen.

4

können Sie WMI verwenden mit

Select * from Win32_LogicalDisk 

http://www.jpsoftwaretech.com/vba/using-wmi-services-in-vba/drive-information-local-network-mapped-drives/

es Sie

haben
Select Case .DriveType 
     Case 0 
      strDriveType = "Unknown" 
     Case 1 
      strDriveType = "No Root Directory" 
     Case 2 
      strDriveType = "Removable Disk" 
     Case 3 
      strDriveType = "Local Disk" 
     Case 4 
      strDriveType = "Network Drive" 
     Case 5 
      strDriveType = "Compact Disc" 
     Case 6 
      strDriveType = "RAM Disk" 
     End Select 
+0

Dies hat das gleiche Ergebnis wie DriveInfo.DriveType mit meinem externen USB-Laufwerk als DriveType 3 oder "Lokale Festplatte" – Web

Verwandte Themen