目的
Windowsが認識しているドライブを全て列挙する
ソースコード
以下に今回のソースコードを示す
main.c
# include <Windows.h>
# include <stdio.h>
void print_drive_info(const char* drive, const char* disk_type) {
char volume_name[256], volume_system[256];
DWORD serial, length, flags;
if (0 == GetVolumeInformationA(drive, volume_name, sizeof(volume_name), &serial, &length, &flags, volume_system, sizeof(volume_system))) return;
printf("ドライブ : %s\n"
"ボリューム名 : %s\n"
"シリアル番号 : %08X\n"
"ディスクの種類 : %s\n"
"ファイルシステム : %s\n"
"システムフラグ : %08X\n"
"ファイル名の最大文字数 : %lu\n\n",
drive, volume_name, serial, disk_type, volume_system, flags, length);
}
int main(void) {
DWORD drive = GetLogicalDrives();
for (int i = 0, flag = 1; i < 26; i++, flag <<= 1) {
if (!(drive & flag)) continue;
char letter[20];
sprintf_s(letter, sizeof(letter), "%c:\\", 'A' + i);
switch (GetDriveTypeA(letter)) {
case DRIVE_REMOVABLE:
print_drive_info(letter, "リムーバブルディスク");
break;
case DRIVE_FIXED:
print_drive_info(letter, "ハードディスクドライブ");
break;
case DRIVE_REMOTE:
print_drive_info(letter, "ネットワークドライブ");
break;
case DRIVE_CDROM:
print_drive_info(letter, "ディスクドライブ");
break;
default:
print_drive_info(letter, "その他のドライブ");
break;
}
}
return 0;
}
結果
しかし私のPCのドライブは、エクスプローラーで確認すると、以下の通りであり、全てのドライブが列挙されているわけではないことが分かる。
結論
実験レポート風に書いてますが、そこには特に意味はないです。
問題はなぜIドライブ以降が列挙されなかったかということです。
ちなみにIドライブ以降のドライブは全てNTFS形式でフォーマットされています。
また、どのドライブもアクセス権限はあります。
参考サイト
どうもmain関数の3行目を消すと全列挙されるっぽいです。
なんでだろう…@yumetodoさんに誤植指摘されて修正した結果、全ドライブリストを列挙できました。