我的印象是,如果我有这样的UNC路径:
\\SRVR-A\Home\UserA\Documents\TestFolder
且I wanted to extend it超出了MAX_PATH限制,我可以这样做:
\\?\UNC\SRVR-A\Home\UserA\Documents\TestFolder
但是,当我在Windows XP上运行以下内容时,它失败并显示错误代码ERROR_INVALID_NAME
:
TCHAR buffDummy;
DWORD dwNeededLn = ::GetLongPathName(
L"\\\\?\\UNC\\SRVR-A\\Home\UserA\\Documents\\TestFolder",
&buffDummy, 0);
if(dwNeededLn == 0)
{
//Error
int nErrorCode = ::GetLastError();
}
我错过了什么吗?
PS。该文件夹存在,如果我改为\\SRVR-A\Home\UserA\Documents\TestFolder
,API工作正常。
答案 0 :(得分:1)
提示实际上来自MSDN页面的引用:“在许多文件系统上,短文件名包含波形符(〜)字符。但是,并非所有文件系统都遵循此约定”。
使用远程文件系统,您不知道基础文件系统。你不能猜测它的短文件名生成方法是什么,或者即使有这样的概念(毕竟它确实是一个特定于Windows的概念)
因此,GetLongPathName
应该可以发挥作用。现在它似乎可以在某些情况下工作,但这可能是一个不幸的事故 - 如果系统足够相似,将本地规则应用于远程名称可能会有效。
答案 1 :(得分:0)
函数::GetLongPathName()
实际上是两个函数:::GetLongPathNameA()
(ANSI)和::GetLongPathNameW()
(宽)。
在包含文件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