GetLogicalDrives
GetLogicalDriveStrings

Funciones del API para saber las unidades lógicas de nuestro equipo



Publicado: 18/Abr/2001



Hay ocasiones en las que necesitamos saber que unidades tenemos instaladas en nuestro equipo e incluso puede que lo que necesitemos saber sea las letras que están disponibles para usarlas en conexiones de red.
En esas ocasiones podemos usar la función del API GetLogicalDrives para obtener esa información.
La función GetLogicalDrives devuelve un valor LONG con las unidades lógicas disponibles en el sistema.
El "problemilla" es que dicho valor es una "máscara de bits", es decir, si la unidad A existe en nuestro sistema, el bit 0 será 1, si no existe, será un cero. La unidad C está representada por el segundo bit y así sucesivamente.

Por tanto, podemos hacer un bucle desde 0 hasta 25, (para las unidades A hasta Z), comprobando si el bit está conectado (1) o desconectado (0), para saber si la unidad existe o no existe respectivamente.

Veamos el código de ejemplo para mostrar las letras de unidades instaladas y las disponibles, (las que no están instaladas).

La declaración de esta función (para 32 bits) es:

Private Declare Function GetLogicalDrives Lib "kernel32" () As Long

En el siguiente ejemplo, usaremos dos controles ComboBox, uno para las unidades ocupadas y el otro para las disponibles:

Dim i As Long
Dim ret As Long
'
ret = GetLogicalDrives()
If ret Then
    For i = 0 To 25
        ' Si el bit es cero, es que no existe la unidad o no está mapeada
        If (ret And 2 ^ i) = 0 Then
            ' Mostrar el nombre de la unidad disponible
            Combo2.AddItem Chr$(i + 65) & ":"
        Else
            ' Mostrar el nombre de la unidad ocupada
            Combo1.AddItem Chr$(i + 65) & ":"
        End If
    Next
    ' Mostrar la primera letra disponible
    If Combo2.ListCount > 0 Then
        Combo2.ListIndex = 0
    End If
    ' Mostrar la primera letra ocupada
    If Combo1.ListCount > 0 Then
        Combo1.ListIndex = 0
    End If
End If

En el código mostrado, se hace una comprobación de los 26 primeros bits (empiezan a contar por cero), si el contenido de dicho bit es UNO, quiere decir que la unidad comprobada está asignada, sin embargo, si el contenido de ese bit es CERO, es que dicha unidad no está asignada, por tanto, está disponible.

 

Además de esta función, existe otra: GetLogicalDriveStrings, con la que se pueden obtener las unidades disponibles, pero el resultado se devuelve como una cadena de caracteres; cada una de esas unidades estarán separadas por un valor Chr$(0).
Aquí te dejo la declaración de dicha función:


Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" _
    (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Este código asignará a Combo1 las unidades disponibles en nuestro equipo:

Dim i As Long
Dim ret As Long
Dim s As String
'
i = 260
s = String$(i, Chr$(0))
ret = GetLogicalDriveStrings(i, s)
' Si el valor devuelto es mayor que el tamaño del buffer, es que el buffer debe ser mayor
If ret > i Then
    i = ret + 2
    s = String$(i, Chr$(0))
    ret = GetLogicalDriveStrings(i, s)
End If
'
If ret Then
    ' Quitar los caracteres extras
    s = Left$(s, ret)
    Do
        i = InStr(s, Chr$(0))
        If i Then
            Combo1.AddItem Left$(s, i - 1)
            s = Mid$(s, i + 1)
        End If
    Loop While i
    ' Mostrar la primera letra disponible
    If Combo1.ListCount > 0 Then
        Combo1.ListIndex = 0
    End If
End If

Fíjate que en esete caso se incluye la barra junto al nombre de la unidad.

Estas funciones podemos usarlas junto a GetDriveType, para saber de que tipo, (Fija, extraible, CD-ROM, etc.), es cada una de las unidades que tenemos instaladas.

 

Espero que estas funciones te sean de utilidad.
Nos vemos.
Guillermo


ir al índice