利用可能なドライブ名を列挙するには GetLogicalDriveStrings 関数を使用します。
各ドライブのディスクの容量は GetDiskFreeSpaceEx 関数で取得できます。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int _tmain()
{
TCHAR szDrv[256] = {0};
LPTSTR pDrv = szDrv;
UINT uDrvType;
DWORDLONG dwlFreeBytesAvailableToCaller;
DWORDLONG dwlTotalNumberOfBytes;
DWORDLONG dwlTotalNumberOfFreeBytes;
GetLogicalDriveStrings(255, szDrv);
while(pDrv[0] != TEXT('\0')) {
//ドライブ名を表示
_tprintf(TEXT("%s\t"), pDrv);
//ドライブタイプを表示
uDrvType = GetDriveType(pDrv);
switch(uDrvType) {
case 0:
_tprintf(TEXT("ドライブの種類が判断できません。"));
break;
case 1:
_tprintf(TEXT("ルート ディレクトリが存在しません。"));
break;
case DRIVE_REMOVABLE:
_tprintf(TEXT("リムーバブルディスク"));
break;
case DRIVE_FIXED:
_tprintf(TEXT("ハードディスク"));
break;
case DRIVE_REMOTE:
_tprintf(TEXT("ネットワークドライブ"));
break;
case DRIVE_CDROM:
_tprintf(TEXT("CD-ROMドライブ"));
break;
case DRIVE_RAMDISK:
_tprintf(TEXT("RAMディスク"));
break;
default:
break;
}
_tprintf(TEXT("\t"));
//ディスクの空き容量などを表示
if(GetDiskFreeSpaceEx(pDrv, reinterpret_cast<PULARGE_INTEGER>(&dwlFreeBytesAvailableToCaller),
reinterpret_cast<PULARGE_INTEGER>(&dwlTotalNumberOfBytes),
reinterpret_cast<PULARGE_INTEGER>(&dwlTotalNumberOfFreeBytes))
) {
_tprintf(TEXT("(%dMB/%dMB)"),
static_cast<int>(dwlTotalNumberOfFreeBytes / 1024 / 1024),
static_cast<int>(dwlTotalNumberOfBytes / 1024 / 1024));
}
_tprintf(TEXT("\r\n"));
pDrv += lstrlen(pDrv) + 1;
}
return 0;
}