该函数::GetLongPathName()
实际上是两个函数:::GetLongPathNameA()
(ANSI)和::GetLongPathNameW()
(Wide)。
在包含文件fileapi.h
中有一些代码:
#ifdef UNICODE
#define GetLongPathName GetLongPathNameW
#else
#define GetLongPathName GetLongPathNameA
#endif // !UNICODE
仅GetLongPathNameW()
处理较长的路径名。
您需要确保定义了“UNICODE”,否则要专门调用GetLongPathNameW()
,而不是GetLongPathName()
我在家里的局域网上做了一些测试。
CALCITE
是外置硬盘。它运行某种类型的 Unix/Linux 变体,但我没有修改它。它的 IP 为192.168.1.2
. 我正在使用 VC Express 2013 在 Win7 Professional 桌面上运行测试。
#include <iostream>
#include <string>
#include <Windows.h>
void Test(const std::wstring &sName)
{
std::wcout << sName << L" ==> ";
const size_t nBuffsize = 1024;
wchar_t szBuff[nBuffsize] = { 0 };
if (::GetLongPathNameW(sName.c_str(), szBuff, nBuffsize))
std::wcout << szBuff << std::endl;
else
std::wcout << L"Error: " << ::GetLastError() << std::endl;
}
int main()
{
Test(L"\\\\CALCITE\\public\\x.txt");
Test(L"\\\\?\\UNC\\CALCITE\\public\\x.txt");
Test(L"\\\\?\\UNC\\192.168.1.2\\public\\x.txt");
Test(L"\\\\CALCITE\\public\\bad name.txt");
Test(L"\\\\CALCITE\\Bad path\\x.txt");
return 0;
}
结果:
\\CALCITE\public\x.txt ==> \\CALCITE\public\x.txt
\\?\UNC\CALCITE\public\x.txt ==> \\?\UNC\CALCITE\public\x.txt
\\?\UNC\192.168.1.2\public\x.txt ==> \\?\UNC\192.168.1.2\public\x.txt
\\CALCITE\public\bad name.txt ==> Error: 2
\\CALCITE\Bad path\x.txt ==> Error: 67
错误 2 是 ERROR_FILE_NOT_FOUND
错误 67 是 ERROR_BAD_NET_NAME