在调用FindFirstFile时"<"的含义是什么?

pau*_*ulm 3 c++ windows winapi

如果我创建一个包含"Hello.txt"的目录,那么以下代码将输出"Hello.txt":

#include <windows.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA findData = {};
    HANDLE hFind = ::FindFirstFile(L"<.txt", &findData);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        std::wcout << findData.cFileName << std::endl;
        while (::FindNextFile(hFind, &findData))
        {
            std::wcout << findData.cFileName << std::endl;
        }
        ::CloseHandle(hFind);
    }
    else
    {
        std::wcout << "FindFirstFile: " << ::GetLastError() << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但为什么"<"在调用中表现得像"*" FindFirstFile

MSDN表示只有外卡承租人在此次通话中有效(即?或*).

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx

编辑:

似乎是非常相关的FindFirstFile无证通配符或bug?

Dav*_*nan 7

<是文件名中的无效字符.它是一个保留字符,如下所述:命名文件,路径和命名空间 - 命名约定.

我的猜测是,FindFirstFile简单地将所有保留字符视为通配符.也许这是一个向后兼容的原因.同样,因为<这里正式无效,并且因为行为没有记录,所以你不应该依赖它.

更新

感谢@eryksun在评论中提供了一些低级细节.实际执行搜索的低级层使用<>作为通配符.在Win32层转换*?<>通过搜索字符串上下层之前.这解释了为什么*并且<可以从高层互换.