在我的一些 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.
和四個檔案:
a.qqq
b.qqqt
c.qqqx
c.qqq123
我期望得到的輸出只是a.qqq
. 但實際發生的是,所有四個檔案都被列印出來了。我也得到了與 CMD 相同的結果dir *.qqq
,所以不僅僅是 Delphi 在做奇怪的事情,而且 PowerShell 的dir *.qqq
作業正常。什么可能導致這種行為?特別是,如果它是作業系統中的一些特定設定(這似乎表明我沒有在所有機器上得到這個結果,只是一些),我可以在我的程式中做些什么來強制執行無論作業系統設定如何,預期的行為?
uj5u.com熱心網友回復:
原因是底層的 Windows 函式會檢查長檔案名和短檔案名:
搜索包括長檔案名和短檔案名。
您可以看到,當您在 CMD 中將 /X 引數添加到 dir 呼叫時:
dir /X *.qqq
一種可能的解決方案是為每個找到的僅采用長名稱的名稱添加另一個過濾器檢查。
實際上,這就是 Delphi 在 中所做的TDirectory.GetFiles
,這有時會成為手寫例程的更好替代方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496410.html