Получение списка томов всегда говорит C: \ - PullRequest
1 голос
/ 29 сентября 2011

Почему Следующий код всегда сообщает C:\, хотя он сообщает другое имя устройства

  handle = FindFirstVolumeW(volName, sizeof(volName));
  do{
    wchar_t wVolName[MAX_PATH];
    QString::fromWCharArray(volName).toWCharArray(wVolName);//make a copy of volName on wVolName
    wVolName[wcslen(volName)-1] = L'\0';
    wchar_t wDeviceName[MAX_PATH];
    int charCount = 0;
    charCount = QueryDosDeviceW(&wVolName[4], wDeviceName, ARRAYSIZE(wDeviceName));

    qDebug() << QString::fromWCharArray(wVolName) << "Device: " << QString::fromWCharArray(wDeviceName);//print wVolName and wDeviceName

    wchar_t driveName[MAX_PATH];
    GetVolumePathName(wDeviceName, driveName, MAX_PATH);
    CloseHandle(handle);

    qDebug() << QString::fromWCharArray(driveName);

  }while(FindNextVolume(handle, volName, sizeof(volName)));
  FindVolumeClose(handle);

Выход:

"\\?\Volume{5c77cc58-d5ab-11e0-a0ec-806d6172696f}" Device:  "\Device\HarddiskVolume2" 
"C:\" 
"\\?\Volume{5c77cc59-d5ab-11e0-a0ec-806d6172696f}" Device:  "\Device\HarddiskVolume3" 
"C:\" 
"\\?\Volume{5c77cc57-d5ab-11e0-a0ec-806d6172696f}" Device:  "\Device\CdRom0" 
"C:\" 
"\\?\Volume{5c77cc56-d5ab-11e0-a0ec-806d6172696f}" Device:  "\Device\Floppy0" 
"C:\" 
"\\?\Volume{8d974f2c-e9a1-11e0-b7da-0013d407432f}" Device:  "\Device\Harddisk1\DP(1)0-    0+8" 
"C:\" 

Почему не сообщается D, E и т. Д.

EDIT

и как я могу получить букву диска, назначенную для тома

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

В документации по этой функции сказано все:

Необходимо указать действительный путь к пространству имен Win32.Если вы укажете путь к пространству имен NT, например, «\ DosDevices \ H:» или «\ Device \ HardDiskVolume6», функция возвращает букву диска текущего тома, а не букву диска этого пути пространства имен NT.

Кстати, том можно подключить к нескольким буквам дисков (имя диска, например C:, является не чем иным, как символической ссылкой в ​​пространстве имен NT), так что в действительности перевод смысла не имееттаким образом.

2 голосов
/ 29 сентября 2011

Из документации GetVolumePathName :

Если указать относительный каталог или имя файла без тома квалификатор GetVolumePathName возвращает букву диска текущего объем.

1 голос
/ 29 сентября 2011

Возможно, потому что вы звоните CloseHandle в цикле: не делайте этого.

Похоже, что вы смоделировали свой код после http://msdn.microsoft.com/en-us/library/cc542456%28v=vs.85%29.aspx:, вы заметите, что единственный раз, когда они вызывают CloseHandle, ПОСЛЕ того, как завершен весь цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...