el Guille, la Web del Visual Basic, C#, .NET y más...

Funciones del API:
GetDriveType y GetLogicalDrives

 
Publicado el 03/Nov/2007
Actualizado el 03/Nov/2007
Autor: Guillermo 'guille' Som

Ejemplos de uso de las funciones del API del kernel32.dll: GetDriveType y GetLogicalDrives, con código para VB como para C#.



 

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

 


Código para Visual Basic.NET (VB.NET) 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

 

Código para C Sharp (C#) 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
 


Código de ejemplo (comprimido):

No hay nada que bajar, todo está mostrado en la página.


 


La fecha/hora en el servidor es: 13/11/2024 9:48:06

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024