2012-01-14 169 views
2

使用代碼未知的數據如下,以獲得我的驅動器的名稱:掌握GetLogicalDriveStrings()

const DWORD buffer_length = sizeof(DWORD)*CHAR_BIT; 
WCHAR buffer[buffer_length] = {0}; 
GetLogicalDriveStrings(buffer_length,buffer); 
std::set<wchar_t> drives_letters; 
for(auto e : buffer) 
{ 
    drives_letters.insert(e); 
} 

我得到以下的結果輸出(遍歷drives_letters):

: //what on earth is this? 
C 
D 
E 
F 
G 
I 
\ //and what on earth is this? 
+0

你試過GetDriveType,看看它返回? – dowhilefor 2012-01-14 15:55:49

+0

@dowhilefor現在正在處理它 – smallB 2012-01-14 15:56:55

回答

11

GetLogicalDriveStringsC:\的形式返回字符串。這可以從這個文檔通道推斷:

在緩衝器中的每個串任何需要根目錄 可以被使用,諸如用於GetDriveTypeGetDiskFreeSpace功能。

既然你把這些字符轉換爲一組,其中不允許重複,你結束了所有的不同的驅動器字母加兩個冒號和一個反斜槓的一個副本。而冒號最先打印和最後一個反斜槓的原因是std::set本身是有序的,所以每個字符的ASCII碼決定。

+0

它確實有道理,謝謝,將接受。 – smallB 2012-01-14 16:01:44

3

您的for循環錯誤。您假定GetLogicalDriveStrings()僅返回單個驅動器號,並非如此(如果需要,請使用GetLogicalDrives()代替)。它返回路徑驅動器根文件夾,因此你需要改變你的for循環以下事項:

const DWORD buffer_length = 104; // can return drive paths A:\ - Z:\ 
WCHAR buffer[buffer_length+1] = {0}; // room for null terminator 

GetLogicalDriveStrings(buffer_length, buffer); 
std::set<wchar_t> drives_letters; 
for(wchar_t *drive = buffer; *drive != 0; drive += 4) 
{ 
    drives_letters.insert(*drive); 
}