FindFirstFile 匹配不应匹配的通配符

pep*_*pak 6 delphi winapi cmd wildcard

在我的一些 Windows 10 计算机上,FindFirstFile匹配绝对不应该匹配的文件。假设Delphi中有以下程序:

{$apptype console}
uses Windows;

var
  FindHandle: THandle;
  FindData: WIN32_FIND_DATA;

begin
  FindHandle := FindFirstFile('*.qqq', FindData);
  if FindHandle <> INVALID_HANDLE_VALUE then
  begin
    try
      repeat
        Writeln(PChar(@FindData.cFileName[0]));
      until not FindNextFile(FindHandle, FindData);
    finally
      FindClose(FindHandle);
    end;
  end;
end.
Run Code Online (Sandbox Code Playgroud)

和四个文件:

a.qqq
b.qqqt
c.qqqx
c.qqq123
Run Code Online (Sandbox Code Playgroud)

我期望得到的输出只是a.qqq. 但实际发生的情况是,所有四个文件都被打印出来。我使用 CMDdir *.qqq也得到了相同的结果,所以这不仅仅是 Delphi 做了奇怪的事情,而且 PowerShell 也dir *.qqq按预期工作。什么可能导致这种行为?特别是,如果它是操作系统中的某些特定设置(这似乎是因为我没有在所有机器上得到这个结果,只是在某些机器上得到这个结果),我是否可以在程序中执行某些操作来强制执行无论操作系统设置如何,预期行为?

Uwe*_*abe 9

原因是底层 Windows 函数检查长文件名和短文件名:

搜索包括长文件名和短文件名。

可以看到,当在CMD中的dir调用中添加/X参数时:

dir /X *.qqq
Run Code Online (Sandbox Code Playgroud)

一种可能的解决方案是为每个找到的名称添加另一个过滤器检查,该名称仅采用长名称。

实际上,这就是 Delphi 在 中所做的TDirectory.GetFiles,有时使其成为手写例程的更好替代方案。