调用 FindFirstFile 时“<”的含义是什么?

What is the meaning of "<" in a call to FindFirstFile?

如果我创建一个包含 "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;
}

但为什么“<”在调用 FindFirstFile 时表现得像“*”?

MSDN 表示只有通配符承租人在此调用中有效(即?或 *)。

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

编辑:

好像很有关系FindFirstFile undocumented wildcard or bug?

< 是文件名中的无效字符。它是一个保留字符,如此处记录:Naming Files, Paths, and Namespaces – Naming Conventions

我的猜测是 FindFirstFile 的实现简单地将所有保留字符视为通配符。也许这有向后兼容性的原因。尽管如此,由于 < 在这里正式无效,并且由于该行为未记录,因此您不应该依赖它。

更新

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