【问题标题】:Convert HarddiskVolume path to normal path [duplicate]将 HarddiskVolume 路径转换为普通路径 [重复]
【发布时间】:2015-09-10 01:32:32
【问题描述】:

我有这样的设备路径

设备\HarddiskVolume2\Windows\

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

C:\Windows

我尝试使用 (_fullpath-_splitpath-etc...) 但没有新结果。这个功能是做什么的?

【问题讨论】:

    标签: c++ windows path


    【解决方案1】:

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

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

    【讨论】:

    • 我试试这个,但不行HANDLE hFile = CreateFile("\\?\HarddiskVolume2\Windows\\", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hFile == INVALID_HANDLE_VALUE) { cout &lt;&lt; "Invaild handle" &lt;&lt; endl; } else { TCHAR lpszFilePath[MAX_PATH]; GetFinalPathNameByHandle(hFile, lpszFilePath, sizeof(lpszFilePath), VOLUME_NAME_DOS); cout &lt;&lt; lpszFilePath &lt;&lt; endl; }
    • @user3523388:我已经更正了您的代码并将其添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 2019-10-01
    • 2010-10-13
    • 2014-01-28
    • 2017-08-23
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多