ドライブの容量の取得には、GetDidkFreeSpace関数を使用します。
この関数は、引数にドライブ名(例えば、"C:\","A:\"のように),クラスタ情報 などの格納先を指定します。この関数から容量などが直接得られるわけではなく、 引数に格納されるクラスタ,セクタ情報をもとに計算して取得します。
(指定ドライブの容量)
= 1クラスタあたりのセクタ数 × 1セクタあたりのバイト数 × 総クラスタ数
(指定ドライブの空き容量)
= 1クラスタあたりのセクタ数 × 1セクタあたりのバイト数 × 空きクラスタ数
関数が失敗したとき0が返されます。 GetLogicalDrives関数と関わり合いが深いので、これらの関数 のプログラムコードに付け加えて利用することにします。(付け加えたものは太字)
(GetDidkFreeSpace 関数の使用方法)
このサンプルでは、CommandButtonをクリックすることでListBoxに 使用可能なドライブを表示し、Labelにその容量と・空き容量を表示してします。
フォームのGeneralセクションに次の宣言コードとプロシージャを1つを追加 して下さい。
'APIの宣言 '現在利用可能なディスクドライブをビットマスク形式で取得する関数 Private Declare Function GetLogicalDrives Lib "kernel32" () As Long〜追加部分〜 'ディスク容量を得る関数 Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias _ "GetDiskFreeSpaceA" (ByVal lpRootPathName _ As String, lpSectorsPerCluster As Long, _ lpBytesPerSector As Long, _ lpNumberOfFreeClusters As Long, _ lpTotalNumberOfClusters As Long) As Long〜追加部分〜 次に、フォームにCommandButtonとListBoxとLabel4つを配置し、 Command1_Click(),List1_Click()プロシージャに次のコードを追加します。
Private Function GetDiskSpace(DriveName As String, _ SpaceType As Integer, ReturnValue) As Boolean '------------------------------------------------------------ 'プロシージャ名 GetDiskSpace '処理内容 指定ドライブの空き容量や容量を得る(2GBまで) '引数 'DriveName : 指定ドライブパス名("C:\"のような) 'SpaceType : 0の時空き容量取得,1の時容量取得 'ReturnValue : 得られた容量を格納 '戻り値 関数が失敗したときFalse、それ以外True '------------------------------------------------------------ Dim SectorsPerCluster As Long '1クラスタあたりのセクタ数 Dim BytesPerSector As Long '1セクタあたりのバイト数 Dim FreeClusterCount As Long '空きクラスタ数 Dim ClusterCount As Long '総クラスタ数 Dim ret As Long '戻り値 ret = GetDiskFreeSpace(DriveName, SectorsPerCluster, _ BytesPerSector, FreeClusterCount, _ ClusterCount) If ret = 0& Then GetDiskSpace = False: Exit Function Select Case SpaceType Case 0 ReturnValue = FreeClusterCount * SectorsPerCluster * BytesPerSector Case 1 ReturnValue = ClusterCount * SectorsPerCluster * BytesPerSector End Select GetDiskSpace = True End Function
Private Sub Command1_Click() Dim drivestring As String 'ドライブ名 Dim drives As Long 'ディスクドライブのビットマスク Dim i As Integer 'カウンタ Dim DriveType As Long 'ドライブタイプ '現在利用可能なディスクドライブをビットマスク形式で取得 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リストされているドライブをクリックすると、Labelにドライブの容量が表示されます。
Private Sub List1_Click()
Dim drivestring As String Dim DiskSpace As Long drivestring = Left$(List1.List(List1.ListIndex), 3) If GetDiskSpace(drivestring, 0, DiskSpace) = False Then MsgBox "ディスク容量取得失敗" Exit Sub End If Label1.Caption = DiskSpace & "バイト" If GetDiskSpace(drivestring, 1, DiskSpace) = False Then MsgBox "ディスク容量取得失敗" End If Label2.Caption = DiskSpace & "バイト" End Sub
なお、この方法は、2GBを越える容量に対応していません。