获取卷列表总是说C:\

时间:2011-09-29 16:23:57

标签: c++ winapi qt visual-c++

为什么以下代码始终报告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:\" 

为什么不报告DE等。

修改

以及如何导出分配给卷的驱动器号

3 个答案:

答案 0 :(得分:3)

该功能的文档说明了一切:

  

您必须指定有效的Win32命名空间路径。如果指定NT命名空间路径,例如“\ DosDevices \ H:”或“\ Device \ HardDiskVolume6”,则该函数返回当前卷的驱动器号,而不是该NT命名空间路径的驱动器号。

顺便说一句,一个卷可以挂载到多个驱动器号(类似C:的驱动器名称只不过是NT命名空间中的符号链接),所以在这里翻译它真的没有意义方式。

答案 1 :(得分:2)

来自GetVolumePathName documentation

  

如果指定不带卷的相对目录或文件名   限定符,GetVolumePathName返回当前的驱动器号   体积。

答案 2 :(得分:1)

也许是因为你在循环中呼叫CloseHandle:不要这样做。

看起来您在http://msdn.microsoft.com/en-us/library/cc542456%28v=vs.85%29.aspx之后对代码进行了建模:您会注意到他们在整个循环完成后调用CloseHandle的唯一时间。