“<”是什么意思在调用FindFirstFile?

时间:2015-03-13 10:14:45

标签: 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;
}

但为什么“&lt;”在FindFirstFile的调用中表现为“*”?

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

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

编辑:

似乎非常相关FindFirstFile undocumented wildcard or bug?

1 个答案:

答案 0 :(得分:7)

<是文件名中的无效字符。它是一个保留字符,如下所示:Naming Files, Paths, and Namespaces – Naming Conventions

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

<强>更新

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