在我的一些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
也按预期工作。是什么可能导致这种行为呢?特别是,如果是操作系统中的一些特定设置(这似乎可以通过以下事实来说明:我没有在所有计算机上得到这个结果,只是在一些计算机上得到这个结果),是否可以在我的程序中执行一些操作来强制执行预期的行为,而不管操作系统的设置如何?
1条答案
按热度按时间p8h8hvxi1#
原因是基础Windows函数会检查长文件名和短文件名:
搜索包括长文件名和短文件名。
您可以看到,当您将/X参数添加到CMD中的dir调用时:
一个可能的解决方案是为每个找到的名称添加另一个过滤器检查,该过滤器检查仅采用长名称。
实际上,这正是 Delphi 在
TDirectory.GetFiles
中所做的,这使得有时这是一个比手写例程更好的选择。