如果我创建一个包含“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
编辑:
答案 0 :(得分:7)
<
是文件名中的无效字符。它是一个保留字符,如下所示:Naming Files, Paths, and Namespaces – Naming Conventions。
我的猜测是FindFirstFile
的实现只是将所有保留字符视为通配符。也许这是一个向后兼容的原因。同样,因为<
在这里正式无效,并且由于行为没有记录,所以你不应该依赖它。
<强>更新强>
感谢@eryksun在评论中提供了一些低级细节。实际执行搜索的低级别图层使用<
和>
作为外卡。在将搜索字符串传递到较低层之前,Win32层会将*
和?
转换为<
和>
。这解释了为什么*
和<
可以从高级别进行互换。