ドライブを列挙する方法
◆概要
このページは、Visual Basic 6.0でドライブを列挙する方法について記載しています。
VB6.0で、ドライブを列挙する方法には、ファイルシステムオブジェクトを使う方法と、Win32 APIを使う方法があります。
◆ファイルシステムオブジェクトでドライブを列挙する方法
まず、ファイルシステムオブジェクトのDrivesコレクションを取得します。このDrivesコレクションには、利用できるドライブのDriveオブジェクトが含まれています。
次に、For Each...Nextステートメントを使って、ひとつひとつのDriveオブジェクトからDriveLetterプロパティとDriveTypeプロパティを取得すれば、全てのドライブが列挙できます。
Step 1
VBからファイルシステムオブジェクトを使うために、[プロジェクト]メニューの[参照設定]ダイアログボックスで、[Microsoft Scripting Runtime]を選択します。
フォームにコマンドボタンとリストボックスを配置して、コマンドボックスのクリックイベントプロシージャに次の通り記述してください。
Private Sub Command1_Click() Dim objFileSystem As New FileSystemObject Dim colDrives As Drives Dim objDrive As Drive Dim strDriveLetter As String Dim strDriveType As String 'Drivesコレクションを取得 Set colDrives = objFileSystem.Drives 'ドライブが存在する間は For Each objDrive In colDrives With objDrive 'ドライブ文字を取得 strDriveLetter = .DriveLetter & ":" 'ドライb種別を取得 Select Case .DriveType Case 0: strDriveType = "Unknown" Case Removable: strDriveType = "Removable" Case Fixed: strDriveType = "Fixed" Case Remote: strDriveType = "Remote" Case CDRom: strDriveType = "CDRom" Case RamDisk: strDriveType = "RamDisk" End Select End With 'ドライブ文字とドライブ種別を表示 List1.AddItem strDriveLetter & strDriveType Next '最初のドライブを選択 List1.ListIndex = 0 'Driveコレクションを開放 Set colDrives = Nothing End Sub |
◆Win32 API関数を使ってドライブを列挙する方法
GetLogicalDrive()関数、もしくはGetLogicalDrivesString()関数を使って、利用できるドライブを取得します。ここでは、GetLogicalDriveString()関数を使います。
GetLogicalDriveString()関数は、有効なドライブ文字列を取得する関数です。
有効なドライブは、「A:\<NULL>C:\<NULL>D:\<NULL>E:\<NULL>F:\<NULL><NULL>」というように、ドライブ名がNULL文字(VBではvbNullCharを使います)で区切られた文字列として返されます。この文字列から、NULL文字をデリミッタとして文字列を切り離せば、ドライブ名が取得できます。次に、GetDriveType()関数を使って、ドライブの種類を取得します。GetDriveType()関数には、ドライブ名を引数として渡します。このような操作を全てのドライブに対して行なえば、全てのドライブが列挙できます。
標準モジュール
Option Explicit '有効なドライブ文字列を取得する関数の宣言 Public Declare Function GetLogicalDriveStrings Lib "kernel32" _ Alias "GetLogicalDriveStringsA" ( _ ByVal nBufferLength As Long, _ ByVal lpBuffer As String _ ) As Long 'ディスクドライブの種類を取得する関数の宣言 Public Declare Function GetDriveType Lib "kernel32" _ Alias "GetDriveTypeA" ( _ ByVal nDrive As String _ ) As Long 'ディスクドライブの種類を示す定数の宣言 Public Const DRIVE_NODETERMINE_DRIVETYPE = 0 Public Const DRIVE_NOEXIST_ROOTDIRECTORY = 1 Public Const DRIVE_REMOVABLE = 2 Public Const DRIVE_FIXED = 3 Public Const DRIVE_REMOTE = 4 Public Const DRIVE_CDROM = 5 Public Const DRIVE_RAMDISK = 6 |
フォームモジュール
Private Sub Command2_Click() Dim strLogicalDriveString As String * 105 Dim lngDriveStringPoint As Long Dim lngNullStringPoint As Long Dim lngTerminatePaint As Long Dim strDriveLetter As String Dim lngDriveType As Long Dim strDriveType As String Dim lngWin32apiResultCode As Long '有効なドライブ文字列を取得 lngWin32apiResultCode = _ GetLogicalDriveStrings(Len(strLogicalDriveString), _ strLogicalDriveString) 'ドライブ文字の先頭位置を初期化 lngDriveStringPoint = 1 'ドライブ文字列の終端位置を算出 lngTerminatePaint = InStr(strLogicalDriveString, vbNullChar _ & vbNullChar) 'ドライブ文字列の終端まで Do While lngNullStringPoint < lngTerminatePaint 'ドライブ文字の区切り位置を算出 lngNullStringPoint = InStr(lngDriveStringPoint, _ strLogicalDriveString, vbNullChar) 'ドライブ文字を取得 strDriveLetter = _ Mid(strLogicalDriveString, lngDriveStringPoint, _ lngNullStringPoint - lngDriveStringPoint) 'ドライブ種類を取得 Select Case GetDriveType(strDriveLetter) Case DRIVE_NODETERMINE_DRIVETYPE strDriveType = "Unknown" Case DRIVE_NOEXIST_ROOTDIRECTORY strDriveType = "NoExistRootDirectory" Case DRIVE_REMOVABLE strDriveType = "Removable" Case DRIVE_FIXED strDriveType = "Fixed" Case DRIVE_REMOTE strDriveType = "Remote" Case DRIVE_CDROM strDriveType = "CDRom" Case DRIVE_RAMDISK strDriveType = "RamDisk" End Select 'ドライブ文字とドライブ種別を表示 List1.AddItem Replace(strDriveLetter, "\", "") & strDriveType '次のドライブ文字の先頭位置をセット lngDriveStringPoint = lngNullStringPoint + 1 Loop '最初のドライブを選択 List1.ListIndex = 0 End Sub |
◆実行結果