Web Design that taps into the haromny and vision of your dreams.

Recursive Find Files in Dephi

By on in Coding

275 words, estimated reading time 2 minutes.

Simple and very useful Delphi or Pascal function to find files recursively in a given directory.

This function will recursively scan a folder and execute a function each time a file is found.

This function will be run each time a file is found.

Function LogFiles( Const path: String; Const SRec: TSearchRec ): Boolean;
Begin
  Listbox1.Items.Add( path+SRec.Name );
  Result := True;
End;

And this is the main function called with four parameters. FindRecursive('c:/path/to/files/', '*.ext', LogFiles, TRUE)

LogFiles is the name of the above function, and the last parameter decides whether to recurse or not.

procedure FindRecursive(const path: string; const mask: string; LogFunction: TLogFunct; Re_curse: Boolean);
var
  fullpath: string;
 
  function Recurse(var path: string; const mask: string; Re_curse: Boolean): Boolean;
  var
    SRec: TSearchRec;
    retval: Integer;
    oldlen: Integer;
  begin
    //Recurse := FALSE;
    Recurse := Re_Curse;
    oldlen := Length(path);
    retval := FindFirst(path + mask, faAnyFile, SRec);
    while retval = 0 do
    begin
      if (SRec.Attr and (faDirectory or faVolumeID)) = 0 then
        if not LogFunction(path, SRec) then
        begin
          Result := False;
          Break;
        end;
      retval := FindNext(SRec);
    end;
    FindClose(SRec);
    if not Result then Exit;
    retval := FindFirst(path + '*.*', faDirectory, SRec);
    while retval = 0 do
    begin
      if (SRec.Attr and faDirectory) <> 0 then
        if (SRec.Name <> '.') and (SRec.Name <> '..') then
        begin
          path := path + SRec.Name + '/';
          if not Recurse(path, mask, Re_curse) then
          begin
            Result := False;
            Break;
          end;
          Delete(path, oldlen + 1, 255);
        end;
      retval := FindNext(SRec);
    end;
    FindClose(SRec);
  end;
begin
  if path = '' then
    GetDir(0, fullpath)
  else
    fullpath := path;
  if fullpath[Length(fullpath)] <> '/' then
    fullpath := fullpath + '/';
  if mask = '' then
    Recurse(fullpath, '*.*', Re_curse)
  else
    Recurse(fullpath, mask, Re_curse);
end;

Last updated on: Saturday 24th June 2017

 

Comments

Have a question or suggestion? Please leave a comment to start the discussion.

 

Leave a Reply

Please keep in mind that all comments are moderated according to our privacy policy, and all links are nofollow. Do NOT use keywords in the name field. Let's have a personal and meaningful conversation.

Your email address will not be published.