DELPHI 在枚举文件夹下文件所有的文件(包含文件夹里面的文件)如何用进度条显示

2025-01-31 15:42:42
推荐回答(1个)
回答1:

如果不包括子文件夹就可以,你增加一个FileListBox控件,把控件的Mask属性设成 path+'*'+fileext

然后就可以统计出该路径下指定后缀名的文件的个数 FileListBox1.Items.Count,这样知道了文件个数,再加一个ProgressBar进度条,把ProgressBar.max:=FileListBox1.Items.Count,循环前

ProgressBar1.Position:=0 ,在循环内增加这个值就行了。

function MakeFileList(Path, FileExt: string):TStringList;
var
  sch: TSearchrec;
  i,ii:Integer;
begin
  Result := TStringList.Create;

  if RightStr(Trim(Path), 1) <> '\' then
    Path := Trim(Path) + '\'
  else Path := Trim(Path);

  if LeftStr(FileExt,1)<>'.' then FileExt:='.'+trim(FileExt)
  else FileExt:=Trim(FileExt);

  if not DirectoryExists(Path) then
    begin
      Result.Clear;
      Exit;
    end;
  //以下为增加的代码-------
  ii:=0;
  Form1.FileListBox1.Mask:=Path+'*'+fileext;
  i:=Form1.FileListBox1.Items.Count;
  Form1.ProgressBar1.Max:=i;
  Form1.ProgressBar1.Position:=0;
  //--------------------------------
  
  if FindFirst(Path + '*'+fileext,  faAnyFile, sch) = 0 then
  begin
      repeat
        Application.ProcessMessages;
        if ((sch.Name = '.') or (sch.Name = '..')) then
          Continue;
        if DirectoryExists(Path + sch.Name) then
          begin
            Result.AddStrings(MakeFileList(Path + sch.Name, FileExt));
          end
        else
          begin
            if (UpperCase(ExtractFileExt(Path + sch.Name)) = UpperCase(FileExt)) then
            //  or (FileExt = '.*') then
            begin
              Result.Add(Path + sch.Name);
            end;
          end;
          //增加的代码-------
          Inc(ii);
          Form1.ProgressBar1.Position:=ii;
          Form1.Label1.Caption:=IntToStr(ii);
          //----------------------
      until FindNext(sch) <> 0;
      FindClose(sch);
  end;
end;

 如果你的版本是2010的话,也可以用下面的方法,

uses IOUtils, Types;  //IOUtils为2010新增功能

var
  dir: TDirectory; 
  files: TStringDynArray;//需要 Types 单元支持
  str: string;
begin
    //aimDir为路径
    files := dir.GetFiles(aimDir, '*.jpg', TSearchOption.soAllDirectories);
    Memo1.Clear;
    for str in files do
        Memo1.Lines.Add(str);
end;