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 LongEn 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 IfEn 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 LongEste 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 IfFí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