gpt4 book ai didi

delphi - delphi中的文件屏蔽

转载 作者:行者123 更新时间:2023-12-03 15:20:14 25 4
gpt4 key购买 nike

我正在尝试查找扩展名为 .cbr 或 .cbz 的所有文件

如果我将掩码设置为 *.cb?

它找到 *.cbproj 文件。如何设置掩码以仅查找 .cbr 和 .cbz 文件?

这是我正在使用的代码。

我有两个编辑框 EDIT1 是搜索位置,EDIT2 是我放置蒙版的位置。显示找到的内容的列表框和搜索按钮。

edit1 := c:\
edit2 := mask (*.cb?)

空间

    procedure TFAutoSearch.FileSearch(const PathName, FileName : string; const InDir : boolean);
var Rec : TSearchRec;
Path : string;
begin
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
ListBox1.Items.Add(Path + Rec.Name);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;

If not InDir then Exit;

if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then
FileSearch(Path + Rec.Name, FileName, True);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end; //procedure FileSearch



procedure TFAutoSearch.Button1Click(Sender: TObject);
begin
FileSearch(Edit1.Text, Edit2.Text, CheckBox1.State in [cbChecked]);
end;

end.

最佳答案

最简单的方法是对当前文件名使用 ExtractFileExt 并检查它是否与您所需的扩展名匹配。

这是您的 FileSearch 例程的完全重写版本,它完全符合您想要做的事情(无论如何,根据您的问题):

procedure TFAutoSearch.FileSearch(const ARoot: String);
var
LExt, LRoot: String;
LRec: TSearchRec;
begin
LRoot := IncludeTrailingPathDelimiter(ARoot);
if FindFirst(LRoot + '*.*', faAnyFile, LRec) = 0 then
begin
try
repeat
if (LRec.Attr and faDirectory <> 0) and (LRec.Name <> '.') and (LRec.Name <> '..') then
FileSearch(LRoot + LRec.Name)
else
begin
LExt := UpperCase(ExtractFileExt(LRoot + LRec.Name));
if (LExt = '.CBR') or (LExt = '.CBZ') then
ListBox1.Items.Add(LRoot + LRec.Name);
end;
until (FindNext(LRec) <> 0);
finally
FindClose(LRec);
end;
end;
end;

虽然建议使用多个扩展名作为掩码的另一个答案 *.cbr;*.cbz 应该(原则上)有效,但我通过痛苦的经验注意到 Delphi 中的 FindFirstFindNext 方法往往不接受掩码中的多个扩展名!

我提供的代码应该可以很好地满足您的需求,所以尽情享受吧!

更新:允许在运行时动态地在掩码中使用多个扩展(如OP对此答案的第一条评论所示)。

我们要做的是从您的 TEdit 控件中获取一个 String(此 String 是一个或多个文件扩展名,如您所定义的那样)会期望),将String“分解”为Array,并将每个文件与Array中的每个扩展进行匹配。

听起来比实际更复杂:

type
TStringArray = Array of String; // String Dynamic Array type...

// Now let's provide a "Mask Container" inside the containing class...
TFAutoSearch = class(TForm)
// Normal stuff in here
private
FMask: TStringArray; // Our "Mask Container"
end;

此代码将使用 ; 分隔的每个单独的掩码扩展来填充 FMask,例如 .CBR;.CBZ

请注意,此方法不接受通配符或任何其他正则表达式魔法,但您可以根据需要对其进行修改!

procedure TFAutoSearch.ExplodeMask(const AValue: String);
var
LTempVal: String;
I, LPos: Integer;
begin
LTempVal := AValue;
I := 0;
while Length(LTempVal) > 0 do
begin
Inc(I);
SetLength(FMask, I);
LPos := Pos(';', LTempVal);

if (LPos > 0) then
begin
FMask[I - 1] := UpperCase(Copy(LTempVal, 0, LPos - 1));
LTempVal := Copy(LTempVal, LPos + 1, Length(LTempVal));
end
else
begin
FMask[I - 1] := UpperCase(LTempVal);
LTempVal := EmptyStr;
end;
end;
end;

我们现在需要一个函数来确定指定的文件是否与任何定义的扩展名匹配:

function TFAutoSearch.MatchMask(const AFileName: String): Boolean;
var
I: Integer;
LExt: String;
begin
Result := False;
LExt := UpperCase(ExtractFileExt(LExt));
for I := Low(FMask) to High(FMask) do
if (LExt = FMask[I]) then
begin
Result := True;
Break;
end;
end;

现在这是修改后的 FileSearch 过程:

procedure TFAutoSearch.FileSearch(const ARoot: String);
var
LRoot: String;
LRec: TSearchRec;
begin
LRoot := IncludeTrailingPathDelimiter(ARoot);
if FindFirst(LRoot + '*.*', faAnyFile, LRec) = 0 then
begin
try
repeat
if (LRec.Attr and faDirectory <> 0) and (LRec.Name <> '.') and (LRec.Name <> '..') then
FileSearch(LRoot + LRec.Name)
else
begin
if (MatchMask(LRoot + LRec.Name)) then
ListBox1.Items.Add(LRoot + LRec.Name);
end;
until (FindNext(LRec) <> 0);
finally
FindClose(LRec);
end;
end;
end;

最后,以下是启动搜索的方法:

procedure TFAutoSearch.btnSearchClick(Sender: TObject);
begin
ExplodeMask(edMask.Text);
FileSearch(edPath.Text);
end;

其中 edMask 在您的问题中定义为 Edit2edPath 在您的问题中定义为 Edit1。请记住,此方法不支持使用通配符或其他特殊字符,因此 edMask.Text 应该类似于 .CBR;.CBZ

如果您使用 Delphi 的 Regex 库,您可以轻松修改此方法以支持您能想象到的所有表达式案例!

关于delphi - delphi中的文件屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619235/

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