如何为UNC路径制作长Unicode版本?

时间:2014-06-06 03:15:17

标签: c++ winapi unicode unc windows-kernel

我的印象是,如果我有这样的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工作正常。

2 个答案:

答案 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