Delphi下递归查找目录的通用方法

最近的项目中用到了Windows下的目录搜索,特整理了一段通用算法如下:

//定义搜索到文件时的回调函数
//如果是非对象方法,请去掉of object部分
//aFile: 搜索到的文件
//willStop: 外部变量,用于决定回调操作后,是否终止搜索。
TFindFile = procedure(aFile: string; var willStop: boolean) of object;

//通用的目录搜索算法
//aDir: 要搜索的目录
//onFind: 搜索到文件时的回调函数
procedure doFindFile(aDir: string; onFind: TFindFile);
var strDir, strfile: string;
    ff: _WIN32_FIND_DATAA;
    hf: THandle;
    blStop: boolean;
begin
  //记录当前的目录
  strDir := getCurrentDir;
  //设置当前目录为要搜索的目录
  setcurrentDir(aDir);
  try
    //开始搜索
    hf := Windows.FindFirstFile('*.*', ff);
    if hf > 0 then begin
      repeat
        strFile := ff.cFileName;
        //如果是目录,则递归调用
        if (ff.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY) then begin
          if (strFile <> '') and (pos('.', strFile) = 0) then begin
            doFindFile(aDir + strFile + '/', onFind);
          end;
        end else begin
          blStop := False;
          //如果是文件,交由回调函数处理
          onFind(aDir + strFile, blStop);
          //如果回调函数要求终止搜索,则退出当前的递归过程
          if blStop then begin
            Windows.FindClose(hf);
            Exit;
          end;
        end;
      until (not Windows.FindNextFile(hf, ff));
      //终止查找
      Windows.FindClose(hf);
    end;
  finally
    //恢复搜索前的目录
    setCurrentDir(strDir);
  end;
end;

算法的关键在于通过定义具有通用参数的回调函数,来将目录搜索中的关键操作独立出来,以实现算法的通用性。
下面举个例子说明其调用过程:

procedure TForm1.findTextFile(aFile: string; var willStop: boolean);
begin
  if LowerCase(ExtractFileExt(aFile)) = '.txt' then
    willStop := Application.MessageBox(pchar('找到了文本文件 ' + aFile + '! 要停止搜索吗?'), '提示', MB_YESNO) = mrYes;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Edit1.Text 定义了要搜索的目录
  if Copy(Edit1.Text, Length(Edit1.Text), 1) <> '/' then Edit1.Text := Edit1.Text + '/';
  //调用通用搜索算法,查找文本文件
  doFindFile(Edit1.Text, findTextFile);
end;

文件搜索控件 TEasyFileSearch v1.02 by Alexandre GAMBIER Read versions.txt file if you want to see modifications made between each version. Thanks ------ Thanks to : - Udo for his tests on C++ Builder 5 and his ideas for v1.01, v1.02 - J.M. Fontaine for his test on Delphi 7 and his orthography help for v1.01. 1 - DESCRIPTION --------------- TEasyFileSearch is freeware and you use it at your own risk. TEasyFileSearch is completely free also for commercial use. TEasyFileSearch is a component which enable you to search file or folder in directory and subdirectory, using filter mask (*.*, *.exe, ...). You define some search criteria : - look in subfolder , - look for readonly file , - look for hidden file , - look for system file , - look for archile file , - look for directory file, - look for anyfile file . You can filter your research - look for files that is smaller or equal to a size, - look for files that is bigger or equal to a size, - look for file than date is between two date, younger, older or the same than a date, - look for created, modified or opened files. You can exclude files using filter mask, for example you can exclude all files *.exe. TEasyFileSearch don't use recursive function (no stack owerflow error). 2 - LANGUAGE/OS --------------- TEasyFileSearch has been tested only on Delphi 5, 7 and C++ Builder 5. 3 - INSTALLATION ---------------- 1. Extract the TEasyFileSearch.zip 2. Choose Component|Install Component... from the menu 3. Select the Tab 'Into New Package' and fill in: At 'Unit file name': Browse and Select EasyFileSearchReg.pas from the directory where you installed it. At 'Package file name': TEasyFileSearch ( In the directory Projects\Lib ) At 'Description': TEasyFileSearch - looking for files Select Ok 4. You will be asked to confirm building the packag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值