delphi 正在寻找一种对具有不同扩展名的文件执行文件搜索的方法

uujelgoq  于 2023-03-01  发布在  其他
关注(0)|答案(3)|浏览(127)

我想搜索扩展名为.zip或. bak的文件。以下是我的尝试:

var s: TSearchRec;
  function FindArchive: boolean;
  begin
    Result := FindFirst(Archive + '*.bak', faNormal + faReadOnly, s) = 0;
    if not Result then begin
      FindClose(s);
      Result := FindFirst(Archive + '*.zip', faNormal + faReadOnly, s) = 0;
    end;
  end;

这只返回与第一个项目匹配的项目,即 *. bak。我已经尝试过使用和不使用FindClose,但结果是相同的。通常FindClose将由调用例程调用。是否有其他方法可以做到这一点?

368yc8dk

368yc8dk1#

下面是我的例子:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.IOUtils, System.StrUtils;
var
  Dir,
  c   :  string;
begin
  try
    Dir := 'C:\abc'; //The search directory
    for c in TDirectory.GetFiles(Dir, '*.*',
         function (const Path: string; const SearchRec: TSearchRec): Boolean
         begin
           Result := IndexText(ExtractFileExt(SearchRec.Name).ToLower, ['.zip', '.bak']) >= 0;
         end) do
    begin
      writeln(c);
    end;
    readln(c);
  except
     on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
  end;
end.
elcex8rz

elcex8rz2#

如果你有一个现代的 Delphi ,你可以

FOR VAR FileName IN TDirectory.GetFiles('*.bak')+TDirectory.GetFiles('*.zip') DO ...

FileName将是当前目录中所有 *.巴克和 *.zip的名称(一次一个)。如果您需要特定的目录,您可以

FOR VAR FileName IN TDirectory.GetFiles(TPath.Combine(Archive,'*.bak'))+TDirectory.GetFiles(TPath.Combine(Archive,'*.zip')) DO ...

在所有情况下,您都需要

USES System.IOUtils;
zf2sa74q

zf2sa74q3#

如果你想使用Find(First|Next)()搜索多个文件扩展名,那么你必须使用通配符掩码*.*,然后根据需要过滤结果,例如:

var
  s: TSearchRec;
  ext: string

if FindFirst(Archive + '*.*', faNormal or faReadOnly, s) = 0 then
try
  repeat
    if (s.Attr and faDirectory) <> 0 then
      Continue;
    ext := ExtractFileExt(s.Name);
    if SameText(ext, '.bak') or SameText(ext, '.zip') then
    begin
      // use file as needed...
    end;
  until FindNext(s) <> 0;
finally
  FindClose(s);
end;

相关问题