gpt4 book ai didi

delphi - 如何将多个文件扩展名传递给 TDirectory.GetFiles?

转载 作者:行者123 更新时间:2023-12-03 14:43:10 55 4
gpt4 key购买 nike

TDirectory.GetFiles 有一个名为 SearchPattern 的参数。 Embarcadero 的文档显示

The mask used when matching file names (for example, "*.exe" matches all the executable files).

但是,我想传递多种文件类型。我从 FilterComboBox.Mask 获取这些类型。因此,它是一个类似于 '*.txt;*.rtf;*.doc' 的字符串。

我尝试将该字符串直接传递给 GetFiles 但它不起作用。我是否必须解析它,将其分成几部分并将每个单独的部分提供给 GetFiles

最佳答案

GetFiles 调用背后的 RTL 代码 Masks.MatchesMask测试与您的搜索模式的匹配。该函数仅支持对单个蒙版进行蒙版。

另一种方法是使用允许 TFilterPredicateGetFiles 重载。您提供一个谓词来测试名称是否与您的模式匹配。

uses
StrUtils, Types, Masks, IOUtils;

function MyGetFiles(const Path, Masks: string): TStringDynArray;
var
MaskArray: TStringDynArray;
Predicate: TDirectory.TFilterPredicate;
begin
MaskArray := SplitString(Masks, ';');
Predicate :=
function(const Path: string; const SearchRec: TSearchRec): Boolean
var
Mask: string;
begin
for Mask in MaskArray do
if MatchesMask(SearchRec.Name, Mask) then
exit(True);
exit(False);
end;
Result := TDirectory.GetFiles(Path, Predicate);
end;

请注意,MatchesMask 创建并销毁分配的堆 TMask每次被调用时。我可以想象这是长时间搜索的性能瓶颈。在这种情况下,您可以从 MaskArray 创建一个 TMask 对象数组。并使用谓词中的那些进行测试。我不知道这是否是一个有效的担忧,只是我在阅读代码时发生的事情。

关于delphi - 如何将多个文件扩展名传递给 TDirectory.GetFiles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726756/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com