使用可能ドライブの取得には、GetLogicalDrives関数を使用します。
この関数は、引数がなく,ドライブの構成情報が戻り値として返されます。関数が 失敗したときは、0が返されます。
このドライブ情報がLong型である戻り値にどのように保存されているか を理解するのは、なかなか難しいと思います。
ドライブは、A〜Zまでの26個が存在している可能性があり、ユーザーによって それぞれどのドライブが有効であるか異なっています。従って、この変数が これら26個のドライブに対し有効であるか有効でないかを保存している情報 でなければなりません。それでは、ゆっくりと見ていきましょう。 Long型の変数は4バイトですが、ビット単位では、32ビットになります。 従って1ビットにつき、0 Or 1 の情報が入れられるので、この変数で32個の ドライブ情報が判断できることになります。
このビット単位の情報を○と●で表し、○がそのドライブが有効であることを 示し、●がそのドライブが有効でないことを示しているとすると、 戻り値のLong型変数のビット図は次のようになります。 (右端が0ビット目,左端が25ビット目)
こんな感じになっているので、右から順番に1ビットずつ確かめていけば、 すべてのドライブについて調べることができます。以下のサンプルプログラムでは、 このことをビット演算を使って行っています。
(GetLogicalDrives 関数の使用方法)
この解説では、CommandButtonをクリックすることでListBoxに 使用可能なドライブを表示します。
フォームのGeneralセクションに次の宣言コードを追加して下さい。
次に、フォームにCommandButtonとListBoxを配置し、次のコードを追加します。
'APIの宣言 '現在利用可能なディスクドライブをビットマスク形式で取得する関数 Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
このサンプルでは、現在使用可能なドライブを検出し、それをリストに追加 しています。
Private Sub Command1_Click() Dim drivestring As String'ドライブ名 Dim drives As Long 'ディスクドライブのビットマスク Dim i As Integer 'カウンタ '現在利用可能なディスクドライブをビットマスク形式で取得 drives = GetLogicalDrives() '関数の失敗 If drives = 0& Then Exit Sub 'A〜Zドライブを検索する For i = 0 To 25 '最初0ビット目(A)を確かめる、1と論理結合させることで '0か1かがわかる。真(1)の時のみドライブ名として列挙する If (drives And 1&) = 1& Then drivestring = Chr(65 + i) 'ドライブ名(A〜Z)に変換 drivestring = drivestring & ":\" List1.AddItem drivestring End If '1ビットずつシフトさせていき、検索を続ける drives = drives \ 2& Next i End Sub
簡単なように見えて、ビットマスク形式の保存は難しいですね。Boolean型 の配列変数にでもしてくれればわかりやすいんだけど。