我有一个搜索文件的例程:

procedure RecSearch(const sPathName, sFile : String; const subDir : Boolean);
var
   sr    : TSearchRec;
   sPath : String;
begin
   Application.ProcessMessages;
   sPath:=IncludeTrailingBackslash(sPathName);
   if FindFirst(sPath + sFile, faAnyFile - faDirectory, sr) = 0 then
   repeat
      lstBox.Items.Add(sPath + sr.Name); // send files into a ListBox
   until FindNext(sr) <> 0;
   FindClose(sr);

   If not subDir then Exit;

   if FindFirst(sPath + '*.*', faDirectory, sr) = 0 then
   repeat
      if ((sr.Attr and faDirectory) <> 0)  and (sr.Name<>'.') and (sr.Name<>'..') then
         RecSearch(sPath + sr.Name, sFile, True);
   until FindNext(sr) <> 0;
   FindClose(sr);
end;

我的问题是我想使用可以完成所有工作的线程,但我无法完成它

我尝试了这个,它只在当前/选定的目录中搜索,而不在子目录中搜索
const
  WM_ThreadDoneMsg = WM_User + 8;

type TfrmSearch = class;

CSearchThread = class(TThread)
   private
      OwnerForm      : TfrmSearch;
      cntFFound      : Integer;
      inPath, inFile : String;
      inFileAttr     : Integer;
      inFileSize     : LongInt;
      procedure RecSearch(const sPath, sFile : String; const subDir : Boolean);
      procedure AddFile;
   protected
      procedure Execute; override;
   published
      constructor Create(owner : TfrmSearch);
      destructor  Destroy; override;
end;

TfrmSearch = class(TForm)
...
   edPath: TEdit;
   edSearchFor: TEdit;
   chkSubfolders: TCheckBox;
   lvFiles: TListView;
...
   private
   public
      srcThread : CSearchThread;
      procedure SearchThreadDone(var msg : TMessage); message WM_ThreadDoneMsg;
end;

var
  frmSearch: TfrmSearch;

implementation

{$R *.dfm}

constructor CSearchThread.Create(owner : TfrmSearch);
begin
   inherited Create(True);
   OwnerForm:=owner;
   FreeOnTerminate:=True;
   Suspended:=False;
   Priority:=tpHigher;
   cntFFound:=0;
   // clear previous entryes
   ownerForm.lvFiles.Clear;
   ownerForm.StatusBar.Panels[0].Text:='';
end;

destructor CSearchThread.Destroy;
begin
   PostMessage(OwnerForm.Handle, WM_ThreadDoneMsg, Self.ThreadID, 0);
   inherited destroy;
end;

procedure CSearchThread.AddFile;
var
   li    : TListItem;
begin
   li:=OwnerForm.lvFiles.Items.Add;
   li.Caption:=inFile;
   li.SubItems.Add(inPath);
   OwnerForm.StatusBar.Panels[0].Text:=IntToStr(cntFFound)+' files found';
end;

procedure CSearchThread.RecSearch(const sPath, sFile : String; const subDir : Boolean);
var
  sr   : TSearchRec;
  attr : Integer;
begin
   OwnerForm.StatusBar.Panels[1].Text:=IntToStr(1+StrToInt(OwnerForm.StatusBar.Panels[1].Text));
   if FindFirst(IncludeTrailingBackslash(sPath)+sFile, faAnyFile - faDirectory, sr) = 0 then
   repeat
         inPath:=sPath;
         inFile:=sr.Name;
         inFileAttr:=sr.Attr;
         inFileSize:=sr.Size;
         Synchronize(AddFile);
   until FindNext(sr) <> 0;
   FindClose(sr);

   if not subDir then Exit;

   if FindFirst(sPath + '*.*', faDirectory, sr) = 0 then
   repeat
      if ((sr.Attr and faDirectory) <> 0)  and (sr.Name<>'.') and (sr.Name<>'..') then
         RecSearch(sPath + sr.Name, sFile, True);
   until FindNext(sr) <> 0;
   FindClose(sr);
end;

procedure CSearchThread.Execute;
begin
   if DirectoryExists(ownerForm.edPath.Text) then
   begin
      RecSearch(ownerForm.edPath.Text, OwnerForm.edSearchFor.Text, OwnerForm.chkSubfolders.Checked);
   end
   else
      ShowMessage('Path not found');
end;

procedure TfrmSearch.SearchThreadDone(var msg : TMessage);
begin
   bbtnPause.Enabled:=False;
end;

最佳答案

您可以尝试使用FindFile组件,该组件可以在单独的线程中搜索给定的路径。

关于delphi - 递归文件搜索线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1813501/

10-14 12:08
查看更多