開發多媒體、燒錄、自動安裝類應用程式時,常需自動偵測系統中的 CD-ROM/DVD 裝置磁碟代號。本文示範使用 GetLogicalDriveStrings 與 GetDriveType API 完整列舉邏輯磁碟並篩選光碟機。
取得所有邏輯磁碟機根路徑字串,格式:"A:\0C:\0D:\0\0"(雙空字元結尾)。
位元遮罩形式回傳:bit 0 = A:、bit 1 = B:... 適合位元運算愛好者。
輸入根路徑(如 "D:\\"),回傳磁碟類型:
| 常數 | 值 | 說明 |
|---|---|---|
| DRIVE_UNKNOWN | 0 | 無效路徑 |
| DRIVE_NO_ROOT_DIR | 1 | 無根目錄 |
| DRIVE_REMOVABLE | 2 | 可移動裝置(磁碟機、舊式光碟機) |
| DRIVE_FIXED | 3 | 固定硬碟 |
| DRIVE_REMOTE | 4 | 網路磁碟 |
| DRIVE_CDROM | 5 | CD-ROM/DVD |
| DRIVE_RAMDISK | 6 | 記憶體虛擬磁碟 |
#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <string>
using namespace std;
struct { UINT type; LPCSTR name; } DriveTypeFlags[] = {
{ DRIVE_UNKNOWN, "未知" },
{ DRIVE_NO_ROOT_DIR, "無效路徑" },
{ DRIVE_REMOVABLE, "可移動" },
{ DRIVE_FIXED, "固定" },
{ DRIVE_REMOTE, "網路磁碟" },
{ DRIVE_CDROM, "CD-ROM" },
{ DRIVE_RAMDISK, "RAM磁碟" },
{ 0, NULL }
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) {
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
cerr << "MFC 初始化失敗" << endl;
return -1;
}
TCHAR buf[100];
DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR), buf);
string msg = "Logical Drives:\n";
for (TCHAR* s = buf; *s; s += _tcslen(s) + 1) {
LPCTSTR drivePath = s;
msg += drivePath; msg += " ";
UINT uDriveType = GetDriveType(drivePath);
for (int i = 0; DriveTypeFlags[i].name; i++) {
if (uDriveType == DriveTypeFlags[i].type) {
msg += DriveTypeFlags[i].name;
break;
}
}
msg += "\n";
}
cout << msg.c_str();
return 0;
}
for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) 正確處理雙空字元結尾TCHAR、_tcslen、AfxWinInit 支援 ANSI/Unicode 雙版本建置DriveTypeFlags 陣列索引對應常數值,O(1) 查找if (uDriveType == DRIVE_CDROM) 即可識別autorun.infDRIVE_REMOVABLE 並檢查燒錄能力)完整 MFC 主控台專案原始碼已附於配套資源。