● ドライブの種類を列挙する ●

先日作成したVB5.0以前用split() 関数を有効活用したいな〜と思ったら GetLogicalDriveStrings API関数を使えばよいということに気が付いた。というわけで早速有効活用や!!

GetLogicalDriveStrings API関数はドライブ割り当て文字をヌル文字(\0)区切りの文字列で返してくれる。例えば、フロッピードライブ(A)、ハードディスク(C)、CD-ROMドライブ(D) という構成であった場合は、

1 2 3 4 5 6 7 8 9 10 11 12 13
A : \ \0 C : \ \0 D : \ \0 \0

と、文字列が返る。第1引数で返される文字列の終端は \0 が連続するのだが、関数返り値は終端の \0 を除く文字列数を返すのが特徴。上記の場合だと 12 が返る。これを踏まえていざコ〜ディング!!

'論理ドライブを取得
Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

'ドライブの種類を取得
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Private Const DRIVE_UNKNOWN = 0
Private Const DRIVE_NO_ROOT_DIR = 1
Private Const DRIVE_REMOVABLE = 2
Private Const DRIVE_FIXED = 3
Private Const DRIVE_REMOTE = 4
Private Const DRIVE_CDROM = 5
Private Const DRIVE_RAMDISK = 6

'---------------------------------------------------------------
' 関数名:EnumDrives
' 機  能:ドライブを列挙する
' 引  数:なし
' 返り値:なし
' 備  考:必要に応じて改造してください
'---------------------------------------------------------------
Public Sub EnumDrives()

    Dim DriveStringLen As Long
    Dim TempBuff As String * 256
    Dim DriveString As String
    Dim Drives() As String
    Dim DriveNum As Long
    Dim i As Long

    '論理ドライブの文字列を取得
    DriveStringLen = GetLogicalDriveStrings(Len(TempBuff), TempBuff)
    '最後尾に\0があるので、その前までの文字列を取得
    DriveString = Left$(TempBuff, DriveStringLen - 1)

    'ドライブを取得
    DriveNum = SplitData(DriveString, Chr$(0), Drives)
    For i = 0 To DriveNum - 1
        Debug.Print Drives(i) & ":";
        'ドライブの種類を取得
        Select Case GetDriveType(Drives(i))
            Case DRIVE_UNKNOWN
                Debug.Print "種類不明"
            Case DRIVE_NO_ROOT_DIR
                Debug.Print "ルートディレクトリが存在しないドライブ"
            Case DRIVE_REMOVABLE
                Debug.Print "フロッピードライブかリムーバルディスク"
            Case DRIVE_FIXED
                Debug.Print "固定ディスクドライブ"
            Case DRIVE_REMOTE
                Debug.Print "ネットワークドライブ"
            Case DRIVE_RAMDISK
                Debug.Print "RAMディスクドライブ"
            Case DRIVE_CDROM
                Debug.Print "CD-ROMドライブ"
        End Select
    Next i
End Sub

外付けハードディスクやら、USBメモリーやらをありったけ繋ぎ、上記関数を呼び出してみた。

Private Sub Command1_Click()

    Call EnumDrives

End Sub

[実行結果]
A:\:フロッピードライブかリムーバルディスク
C:\:固定ディスクドライブ
D:\:固定ディスクドライブ
E:\:CD-ROMドライブ
F:\:フロッピードライブかリムーバルディスク
G:\:フロッピードライブかリムーバルディスク
H:\:CD-ROMドライブ
I:\:固定ディスクドライブ
J:\:フロッピードライブかリムーバルディスク


戻る