C++ 将硬盘卷路径转换为正常路径

C++ 将硬盘卷路径转换为正常路径,c++,windows,path,C++,Windows,Path,我有一个这样的设备路径 设备\硬盘卷2\Windows\ 我想把它转换成一条像这样的普通路径 C:\Windows 我尝试使用(_fullpath-_splitpath-etc…)但没有新结果。哪个功能执行此任务?一个选项是将设备\替换为\?\,如下所示: \\?\HarddiskVolume2\Windows\ 然后,您可以使用CreateFile()和FILE\u标志\u BACKUP标志打开目录句柄,然后调用查找DOS路径 #include <Windows.h> #incl

我有一个这样的设备路径

设备\硬盘卷2\Windows\

我想把它转换成一条像这样的普通路径

C:\Windows


我尝试使用(_fullpath-_splitpath-etc…)但没有新结果。哪个功能执行此任务?

一个选项是将
设备\
替换为
\?\
,如下所示:

\\?\HarddiskVolume2\Windows\
然后,您可以使用
CreateFile()
FILE\u标志\u BACKUP
标志打开目录句柄,然后调用查找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;
}
#包括
#包括
int main(int argc,字符**argv)
{
wchar_t lpszFilePath[最大路径+1];
德沃德;
HANDLE hFile=CreateFileW(L“\\\\?\\HarddiskVolume2\\Windows\\”,通用\u读取,
文件共享读取文件共享写入文件共享删除,空,打开,
文件\标志\备份\语义,空);
if(hFile==无效的句柄值)
{
printf(“创建文件:%u\n”,GetLastError());
返回1;
}
dw=GetFinalPathNameByHandleW(hFile,
lpszFilePath,_countof(lpszFilePath)-1,卷名\u DOS);
如果(dw==0)
{
printf(“GetFPNBYH:%u\n”,GetLastError());
返回1;
}
else if(dw>=\u countof(lpszFilePath))
{
printf(“GetFPNBYH:output需要%u个字符\n”,dw);
返回1;
}
printf(“%ws\n”,lpszFilePath);
返回0;
}

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

我尝试了这一点,但不起作用
handle hFile=CreateFile(“\\?\HarddiskVolume2\Windows\\”,通用写入,文件共享写入,NULL,打开现有,文件标志,备份语义,NULL);如果(hFile==INVALID_HANDLE_VALUE){cout@user3523388:我已经更正了您的代码并将其添加到我的答案中。