c# - reconocido - no puedo cambiar la letra y rutas de acceso de unidad
¿Cómo puedo determinar si una letra de unidad dada es una unidad local, asignada o USB? (5)
DriveInfo también incluirá los discos duros USB como DriveType.fixed, por lo que esto no ayuda si necesita saber si la interfaz de una unidad es USB o no. Aquí hay una función VB.NET que devuelve todas las letras de la unidad USB externa:
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
Vea este enlace de MSDN: Tareas de WMI: Discos y sistemas de archivos
Dada la letra de una unidad, ¿cómo puedo determinar qué tipo de unidad es?
Por ejemplo, si E: / es una unidad USB, una unidad de red o una unidad de disco duro local.
DriveType muestra las unidades DriveType.Fixed
también como DriveType.Fixed
.
Para verificar si una unidad está sustentada, uso el código Cómo determinar si una ruta de directorio fue SUBST .
Solo como referencia para cualquier otra persona, esto es lo que convertí en 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 también desee tomar nota de la answer AJBauer : DriveInfo también mostrará las unidades de disco duro USB como DriveType.fixed )
Eche un vistazo a la propiedad DriveType
.
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;
}
}