delphi FindFirstFile匹配不应匹配的通配符

tez616oj  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(130)

在我的一些Windows 10机器上,FindFirstFile匹配的文件肯定不应该匹配。

{$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.

和四个文件:

a.qqq
b.qqqt
c.qqqx
c.qqq123

我希望得到的输出只是a.qqq。但实际上发生的是,所有四个文件都被打印出来了。我在CMD的dir *.qqq上也得到了同样的结果,所以不仅仅是 Delphi 在做奇怪的事情,PowerShell的dir *.qqq也按预期工作。是什么可能导致这种行为呢?特别是,如果是操作系统中的一些特定设置(这似乎可以通过以下事实来说明:我没有在所有计算机上得到这个结果,只是在一些计算机上得到这个结果),是否可以在我的程序中执行一些操作来强制执行预期的行为,而不管操作系统的设置如何?

p8h8hvxi

p8h8hvxi1#

原因是基础Windows函数会检查长文件名和短文件名:
搜索包括长文件名和短文件名。
您可以看到,当您将/X参数添加到CMD中的dir调用时:

dir /X *.qqq

一个可能的解决方案是为每个找到的名称添加另一个过滤器检查,该过滤器检查仅采用长名称。
实际上,这正是 Delphi 在TDirectory.GetFiles中所做的,这使得有时这是一个比手写例程更好的选择。

相关问题