调用 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 层将 *
和 ?
转换为 <
和 >
。这解释了为什么 *
和 <
从高层可以互换。
如果我创建一个包含 "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 层将 *
和 ?
转换为 <
和 >
。这解释了为什么 *
和 <
从高层可以互换。