一种选择是更换Device\
with \\?\
像这样:
\\?\HarddiskVolume2\Windows\
然后您可以使用打开目录的句柄CreateFile()
与FILE_FLAG_BACKUP
标记,然后调用GetFinalPathNameByHandle() https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962%28v=vs.85%29.aspx找到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;
}
大概有一个执行转换的内部函数,并且可能可以使用它而不必打开句柄,但据我所知,它没有记录。