【发布时间】:2015-09-10 01:32:32
【问题描述】:
我有这样的设备路径
设备\HarddiskVolume2\Windows\
我想把它转换成这样的普通路径
C:\Windows
我尝试使用 (_fullpath-_splitpath-etc...) 但没有新结果。这个功能是做什么的?
【问题讨论】:
我有这样的设备路径
设备\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;
}
大概有一个执行转换的内部函数,并且可以使用它而不必打开句柄,但据我所知,它没有记录。
【讨论】:
HANDLE hFile = CreateFile("\\?\HarddiskVolume2\Windows\\", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hFile == INVALID_HANDLE_VALUE) { cout << "Invaild handle" << endl; } else { TCHAR lpszFilePath[MAX_PATH]; GetFinalPathNameByHandle(hFile, lpszFilePath, sizeof(lpszFilePath), VOLUME_NAME_DOS); cout << lpszFilePath << endl; }