Introducción:
El código que te voy a mostrar te servirá para saber las unidades que tienes instalada en tu
equipo así como para saber de que tipo son. En particular se usan dos funciones del API de
Windows:
GetDriveType para saber el
tipo de unidad y
GetLogicalDrives para
saber qué unidades están en uso (o las que están libres y disponibles).
En esos links tienes los ejemplos para VB6, por si te has colado aquí, ya que esto solo es para
.NET Framework.
Este código está probado con el Visual Studio 2005, pero debería funcionar en cualquier otra
versión (anterior o posterior).
También está probado en Windows Vista Ultimate, pero debería funcionar incluso en un Windows 98.
Nota importante de seguridad:
El uso de estas funciones son un riesgo... no pasa nada, pero el .NET y el Vista dicen que... en
fin... que si estás usando el Windows Vista, debes ejecutarlo como administrador, incluso desde
el IDE de Visual Studio 2005 (o de las versiones Express), no te funcionará si no lo ejecutas
como administrador.
Con Visual Studio 2008 en Windows Vista no hace falta ejecutarlo como administrador (al menos en
la Beta 2).
Abajo tienes el código de una aplicación de consola, tanto para Visual Basic como para Visual
C#, no hay fichero con el proyecto completo, ya que no hace falta, solo tienes que crear un
nuevo proyecto de tipo consola y pegar ese código.
Espero que te sea de utilidad.
Nos vemos.
Guillermo
El código para Visual Basic .NET (cualquier versión)
'------------------------------------------------------------------------------
' Mostrar las unidades libres y ocupadas (03/Nov/07)
' y el tipo de unidades que son
'
' Usando API para el tipo y las unidades
' Usando la clase Environment para las unidades instaladas
'
' Nota:
' En Windows Vista debe ejecutarse como administrador, incluso en el IDE,
' si no, dará un error de que "requiere elevación" (de privilegios)
'
' ©Guillermo 'guille' Som, 2007
'------------------------------------------------------------------------------
Option Strict On
Imports Microsoft.VisualBasic
Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Module Module1
Enum TipoUnidades As Integer
' Indico también los valores del API (empiezan por cero y van de uno en uno)
Desconocido ' 0 DRIVE_UNKNOWN The drive type cannot be determined.
No_montado ' 1 DRIVE_NO_ROOT_DIR The root path is invalid;
' for example, there is no volume mounted at the path.
Extraible ' 2 DRIVE_REMOVABLE The drive has removable media;
' for example, a floppy drive or flash card reader.
' Las llaves USB los da como extraibles.
Fijo ' 3 DRIVE_FIXED The drive has fixed media;
' for example, a hard drive, flash drive, or thumb drive.
' Los discos duros normales enchufados por USB son fijos.
Remoto ' 4 DRIVE_REMOTE The drive is a remote (network) drive.
CDROM ' 5 DRIVE_CDROM The drive is a CD-ROM drive.
RAMDISK ' 6 DRIVE_RAMDISK The drive is a RAM disk.
End Enum
' Para el tipo de unidad
'Private Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" _
' (ByVal nDrive As String) As TipoUnidades
<DllImport("kernel32.dll")> _
Private Function GetDriveType(ByVal nDrive As String) As TipoUnidades
End Function
' Para las unidades lógicas libres y ocupadas
'Private Declare Function GetLogicalDrives Lib "kernel32.dll" () As Integer
<DllImport("kernel32.dll")> _
Private Function GetLogicalDrives() As Integer
End Function
Sub Main()
Dim ret As Integer
Dim retType As TipoUnidades
Dim sbLibres As New StringBuilder
Dim sbOcupadas As New StringBuilder
ret = GetLogicalDrives()
If ret > 0 Then
For i As Integer = 0 To 25
Dim sUnidad As String = ChrW(i + 65) & ":"
retType = GetDriveType(sUnidad)
' Si el bit es cero, es que no existe la unidad o no está mapeada
If (ret And CInt(2 ^ i)) = 0 Then
' Mostrar el nombre de la unidad disponible
sbLibres.AppendFormat("{0}, ", sUnidad)
Else
' Mostrar el nombre de la unidad ocupada
sbOcupadas.AppendFormat("{0} ({1}){2}", sUnidad, retType, vbTab)
End If
Next
Console.WriteLine("Unidades ocupadas:")
Console.WriteLine(sbOcupadas.ToString)
Console.WriteLine()
Console.WriteLine("Unidades libres:")
Console.WriteLine(sbLibres.ToString)
Else
Console.WriteLine("No se ha podido obtener la información de las unidades lógicas")
End If
' Para ver las unidades usando clases de .NET
Console.WriteLine()
Console.WriteLine("Unidades lógicas usando la clase Environment:")
Dim drives() As String = Environment.GetLogicalDrives()
Console.WriteLine("GetLogicalDrives: {0}", String.Join(", ", drives))
Console.WriteLine()
Console.WriteLine("Pulsa INTRO")
Console.ReadLine()
End Sub
End Module
El código para C# (cualquier versión)
//-----------------------------------------------------------------------------
// Mostrar las unidades libres y ocupadas (03/Nov/07)
// y el tipo de unidades que son
//
// Usando API para el tipo y las unidades
// Usando la clase Environment para las unidades instaladas
//
// Nota:
// En Windows Vista debe ejecutarse como administrador, incluso en el IDE,
// si no, dará un error de que "requiere elevación" (de privilegios)
//
// ©Guillermo 'guille' Som, 2007
//-----------------------------------------------------------------------------
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program
{
enum TipoUnidades : int
{
// Indico también los valores del API (empiezan por cero y van de uno en uno)
Desconocido, // 0 DRIVE_UNKNOWN The drive type cannot be determined.
No_montado, // 1 DRIVE_NO_ROOT_DIR The root path is invalid;
// for example, there is no volume mounted at the path.
Extraible, // 2 DRIVE_REMOVABLE The drive has removable media;
// for example, a floppy drive or flash card reader.
// Las llaves USB los da como extraibles.
Fijo, // 3 DRIVE_FIXED The drive has fixed media;
// for example, a hard drive, flash drive, or thumb drive.
// Los discos duros normales enchufados por USB son fijos.
Remoto, // 4 DRIVE_REMOTE The drive is a remote (network) drive.
CDROM, // 5 DRIVE_CDROM The drive is a CD-ROM drive.
RAMDISK, // 6 DRIVE_RAMDISK The drive is a RAM disk.
};
// Para el tipo de unidad
//Private Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" _
// (ByVal nDrive As String) As TipoUnidades
[DllImport("kernel32.dll")]
private extern static TipoUnidades GetDriveType(string nDrive);
// Para las unidades lógicas libres y ocupadas
//Private Declare Function GetLogicalDrives Lib "kernel32.dll" () As Integer
[DllImport("kernel32.dll")]
private extern static int GetLogicalDrives();
static void Main()
{
int ret;
TipoUnidades retType;
StringBuilder sbLibres = new StringBuilder();
StringBuilder sbOcupadas = new StringBuilder();
ret = GetLogicalDrives();
if(ret > 0)
{
for(int i = 0; i <= 25; i++)
{
string sUnidad = (char)(i + 65) + ":";
retType = GetDriveType(sUnidad);
// Si el bit es cero, es que no existe la unidad o no está mapeada
if((ret & (int)System.Math.Pow(2, i)) == 0)
{
// Mostrar el nombre de la unidad disponible
sbLibres.AppendFormat("{0}, ", sUnidad);
}
else
{
// Mostrar el nombre de la unidad ocupada
sbOcupadas.AppendFormat("{0} ({1})\t", sUnidad, retType);
}
}
Console.WriteLine("Unidades ocupadas:");
Console.WriteLine(sbOcupadas.ToString());
Console.WriteLine();
Console.WriteLine("Unidades libres:");
Console.WriteLine(sbLibres.ToString());
}
else
{
Console.WriteLine("No se ha podido obtener la información de las unidades lógicas");
}
// Para ver las unidades usando clases de .NET
Console.WriteLine();
Console.WriteLine("Unidades lógicas usando la clase Environment:");
string[] drives = Environment.GetLogicalDrives();
Console.WriteLine("GetLogicalDrives: {0}", String.Join(", ", drives));
Console.WriteLine();
Console.WriteLine("Pulsa INTRO");
Console.ReadLine();
}
}
Espacios de nombres usados en el código de este artículo:
System.Text
System.Runtime.InteropServices