将HarddiskVolume路径转换为普通路径

3

我有一个设备路径如下:

Device\HarddiskVolume2\Windows\

我希望将其转换为普通路径,如下所示:

C:\Windows

我尝试使用 (_fullpath-_splitpath-等...) 但没有新的结果。哪个函数可以完成这项工作?

1个回答

2

一种选项是将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;
}

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


我尝试了这个,但不起作用 `HANDLE hFile = CreateFile("\?\HarddiskVolume2\Windows\", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);如果 (hFile == INVALID_HANDLE_VALUE) { cout << "无效的句柄" << endl; } 否则 { TCHAR lpszFilePath[MAX_PATH]; GetFinalPathNameByHandle(hFile, lpszFilePath, sizeof(lpszFilePath), VOLUME_NAME_DOS); cout << lpszFilePath << endl; }` - a7md0
@user3523388:我已经纠正了你的代码并将其添加到我的答案中。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接