How to Search a File through all the SubDirectories in Delphi

前端 未结 5 1970
悲&欢浪女
悲&欢浪女 2020-12-19 15:02

I implemented this code but again i am not able to search through the subdirectories .

     procedure TFfileSearch.FileSearch(const dirName:string);
     beg         


        
5条回答
  •  时光说笑
    2020-12-19 15:22

    I hate those recursive solutions with FindFirst/FindNext and I consider it troublesome that some even forget to use FindClose to clean up resources. So, for the fun of it, a non-recursive solution that should be practical to use...

    procedure FindDocs(const Root: string);
    var
      SearchRec: TSearchRec;
      Folders: array of string;
      Folder: string;
      I: Integer;
      Last: Integer;
    begin
      SetLength(Folders, 1);
      Folders[0] := Root;
      I := 0;
      while (I < Length(Folders)) do
      begin
        Folder := IncludeTrailingBackslash(Folders[I]);
        Inc(I);
        { Collect child folders first. }
        if (FindFirst(Folder + '*.*', faDirectory, SearchRec) = 0) then
        begin
          repeat
            if not ((SearchRec.Name = '.') or (SearchRec.Name = '..')) then
            begin
              Last := Length(Folders);
              SetLength(Folders, Succ(Last));
              Folders[Last] := Folder + SearchRec.Name;
            end;
          until (FindNext(SearchRec) <> 0);
          FindClose(SearchRec);
        end;
        { Collect files next.}
        if (FindFirst(Folder + '*.doc', faAnyFile - faDirectory, SearchRec) = 0) then
        begin
          repeat
            if not ((SearchRec.Attr and faDirectory) = faDirectory) then
            begin
              WriteLn(Folder, SearchRec.Name);
            end;
          until (FindNext(SearchRec) <> 0);
          FindClose(SearchRec);
        end;
      end;
    end;
    

    While it seems to eat a lot of memory because it uses a dynamic array, a recursive method will do exactly the same but recursion happens on the stack! Also, with a recursive method, space is allocated for all local variables while my solution only allocates space for the folder names.
    When you check for speed, both methods should be just as fast. The recursive method is easier to remember, though. You can also use a TStringList instead of a dynamic array, but I just like dynamic arrays.
    One additional trick with my solution: It can search in multiple folders! I Initialized the Folders array with just one root, but you could easily set it's length to 3, and set Folders[0] to C:\, Folders[1] to D:\ and Folders[2] to E:\ and it will search on multiple disks!

    Btw, replace the WriteLn() code with whatever logic you want to execute...

提交回复
热议问题