Получение неизвестных данных с помощью GetLogicalDriveStrings () - PullRequest
2 голосов
/ 14 января 2012

Используя код ниже, чтобы получить имена моих дисков:

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);
}  

В результате я получаю следующий вывод (зацикливание на drive_letters):

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

Ответы [ 2 ]

11 голосов
/ 14 января 2012

GetLogicalDriveStrings возвращает строки в форме C:\.Из этого отрывка документации можно сделать вывод:

Каждая строка в буфере может использоваться везде, где требуется корневой каталог, например, для функций GetDriveType и GetDiskFreeSpace.

Поскольку вы помещаете эти символы в набор, который запрещает дубликаты, вы получаете все буквы дисков плюс одну копию двоеточия и обратную косую черту.И причина того, что двоеточие печатается первым, а обратный слеш - последним, заключается в том, что std::set изначально упорядочен, поэтому решают коды ASCII каждого символа.

3 голосов
/ 15 января 2012

Ваш 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);
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...