将HarddiskVolume路径转换为普通路径

时间:2015-06-24 02:22:21

标签: c++ windows path

我有像这样的设备路径

  

设备\ HarddiskVolume2 \的Windows \

我希望将此转换为这样的正常路径

  

C:\视窗

我尝试使用(_fullpath-_splitpath-etc. ...)但没有新结果。这项工作有哪些功能?

1 个答案:

答案 0 :(得分:1)

一种选择是将Device\替换为\\?\,如下所示:

\\?\HarddiskVolume2\Windows\

然后,您可以使用带有CreateFile()标志的FILE_FLAG_BACKUP打开目录句柄,然后调用GetFinalPathNameByHandle()以查找DOS路径。

#include <Windows.h>
#include <stdio.h>

int main(int argc, char ** argv)
{
    wchar_t lpszFilePath[MAX_PATH + 1];
    DWORD dw;

    HANDLE hFile = CreateFileW(L"\\\\?\\HarddiskVolume2\\Windows\\", GENERIC_READ, 
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 
        FILE_FLAG_BACKUP_SEMANTICS, NULL); 
    if (hFile == INVALID_HANDLE_VALUE) 
    {
        printf("CreateFile: %u\n", GetLastError());
        return 1;
    }

    dw = GetFinalPathNameByHandleW(hFile, 
        lpszFilePath, _countof(lpszFilePath) - 1, VOLUME_NAME_DOS); 

    if (dw == 0)
    {
        printf("GetFPNBYH: %u\n", GetLastError());
        return 1;
    }
    else if (dw >= _countof(lpszFilePath))
    {
        printf("GetFPNBYH: output requires %u characters\n", dw);
        return 1;
    }

    printf("%ws\n", lpszFilePath);
    return 0;
}

据推测,有一个内部函数可以执行转换,也许可以使用它而不必打开句柄,但据我所知,它没有记录。