Contributor: JAMES ALLISON

{=============================================}
{                                             }
{ James L. Allison                            }
{ 1703 Neptune Lane                           }
{ Houston, Texas  77062                       }
{ INTERNET:71565.303@compuserve.com           }
{                                             }
{ Released to public domain.                  }
{ Nov 6, 1994                                 }
{                                             }
{=============================================}


unit Traverse;
interface

uses
  SysUtils;
  {+F}

type
  Action = (Finished, FindMore);
  Process_File = function (Path: string; Info: tSearchRec): Action;
{
  Process_File is a user written procedure that does something
  to a file.  It then returns either Finished, telling Walk_Tree
  to quit, or CONTINUE, telling Walk_Tree to keep going.
}


{
  In the following, start is the path name of the directory where
  traversal is to start.  IT DOES NOT HAVE A TRAILING \ OR A
  FILE PATTERN.
}

procedure Walk_Tree(Start: string;
                    Attr: word;          {see FindFirst}
                    Recursive: boolean;  {walk into subtrees}
                    DoIt: Process_File); {called for each hit}

(*----------------------------------------------------------------------------*)
implementation

(*----------------------------------------------------------------------------*)
procedure Walk_Tree(Start: string;
                    Attr: word;
                    Recursive: boolean;
                    DoIt: Process_File);

  const
    FilePattern = '\*.*';

  var
    SR: tSearchRec;
    Temp: string;
    Status:integer;
  begin
    if Start[Length(Start)] = '\' then dec(Start[0]); {just in case}

    Temp := Start + FilePattern;
    Status:=FindFirst(Temp, Attr, SR);

    while Status = 0 do
      begin
        if DoIt(Start, SR) = Finished then EXIT;

        if ((SR.Attr and faDirectory) <> 0)
           and (SR.name <> '.')
           and (SR.name <> '..')
           and Recursive
           then Walk_Tree(Start + '\' + SR.name, Attr, Recursive, DoIt);

        Status:=FindNext(SR);
      end;

  end;

end.