c++ - 将 HarddiskVolume 路径转换为普通路径

标签 c++ windows path

<分区>

我有这样的设备路径

Device\HarddiskVolume2\Windows\

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

C:\Windows

我尝试使用 (_fullpath-_splitpath-etc...) 但没有新结果。这个工作是哪个函数?

最佳答案

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

\\?\HarddiskVolume2\Windows\

然后您可以使用带有 FILE_FLAG_BACKUP 标志的 CreateFile() 打开目录句柄,然后调用 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;
}

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

关于c++ - 将 HarddiskVolume 路径转换为普通路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31016538/

相关文章:

C++ - EncryptMessage 没有加密正确的数据

c++ - jsoncpp operator= 中的 undefined reference

c++ - 是否可以使用调试器调试 UnhandledExceptionFilters?

windows - 作为计划任务运行 Visual Basic 脚本询问我想如何打开文件

尝试生成多个同一进程时崩溃(访问冲突错误)

java - 任务 ':app:compileDebugKotlin' java.io.IOException 执行失败

algorithm - 这是维特比最佳路径算法的好案例吗?

c++ - glCheckFramebufferStatus 在集成显卡上返回零

c++ - CScrollView 只滚动大面积的部分区域

java - 检查两个 Path2D 之间的交集