1

我的印象是,如果我有这样的 UNC 路径:

\\SRVR-A\Home\UserA\Documents\TestFolder

我想扩展它通过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。该文件夹存在,如果我这样做,API 可以正常工作\\SRVR-A\Home\UserA\Documents\TestFolder

4

2 回答 2

1

提示实际上来自 MSDN 页面的引用:“在许多文件系统上,短文件名包含波浪号 (~) 字符。但是,并非所有文件系统都遵循此约定”。

使用远程文件系统,您不知道底层文件系统。你猜不出它生成短文件名的方法是什么,或者即使有这样的概念(毕竟它确实是一个特定于 Windows 的概念)

因此,GetLongPathName应该完全可以预期。现在它在某些情况下似乎可以工作,但这可能是一个不幸的意外——如果系统足够相似,将本地规则应用于远程名称可能会起作用。

于 2014-06-06T08:40:46.473 回答
1

该函数::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

于 2014-06-06T06:14:14.403 回答