[Back to DIRS SWAG index]  [Back to Main SWAG index]  [Original]

AH>>Hi everyone.  I have a small problem.  How does one go about accessing
  >>EVERY File in every directory, sub-directory on a drive? I guess this is
  >>part of the last question, but how do you access every sub-directory?

Unit FindFile;
{$R-}
Interface

Uses Dos;

Type
  FileProc = Procedure ( x : PathStr );

Procedure FindFiles (DirPath : PathStr;      (* initial path           *)
                     Mask : String;          (* mask to look For       *)
                     Recurse : Boolean;      (* recurse into sub-dirs? *)
                     FileDoer : FileProc);   (* what to do With found  *)

(* Starting at <DirPath>, FindFiles will pass the path of all the Files
   it finds that match <Mask> to the <FileDoer> Procedure.  if <Recurse>
   is True, all such Files in subdirectories beneath <DirPath> will be
   visited as well.  if <Recurse> is False, the names of subdirectories
   in <DirPath> will be passed as well. *)

Implementation

Procedure FindFiles (DirPath : PathStr;      (* initial path           *)
                     Mask : String;          (* mask to look For       *)
                     Recurse : Boolean;      (* recurse into sub-dirs? *)
                     FileDoer : FileProc);   (* what to do With found  *)

  Procedure SubVisit ( DirPath : PathStr );
  Var
    Looking4 : SearchRec;

  begin
    FindFirst ( Concat ( DirPath, Mask ), AnyFile, looking4);
    While ( DosError = 0 ) Do begin
      if ( looking4.attr and ( VolumeID + Directory ) ) = 0
       then FileDoer ( Concat ( DirPath, looking4.name ) );
      FindNext ( Looking4 );
      end;   (* While *)
    if Recurse
     then begin
      FindFirst ( Concat ( DirPath, '*.*' ), AnyFile, looking4);
      While ( DosError = 0 ) and ( looking4.name [1] = '.' ) Do
        FindNext (looking4);   (* skip . and .. directories *)
      While ( DosError = 0 ) Do begin
        if ( ( looking4.attr and Directory ) = Directory )
         then SubVisit ( Concat ( DirPath, looking4.name, '\' ) );
        FindNext ( Looking4 );
        end;   (* While *)
      end;   (* if recursing *)
  end;   (* SubVisit *)


begin   (* FindFiles *)
  SubVisit ( DirPath );
end;   (* FindFiles *)

end.

   --------------------------------------------------------------------

Program Visit;

Uses Dos, FindFile;

{$F+}
Procedure FoundOne ( Path : PathStr );  (* MUST be Compiled With $F+ *)
{$F-}
begin
  WriteLn ( Path );
end;

begin
  WriteLn ( '-------------------------------------------------------------');
  FindFiles ( '\', '*.*', True, FoundOne );
  WriteLn ( '-------------------------------------------------------------');
end.

   -----------------------------------------------------------------------

FoundOne will be passed every File & subdirectory.  if you just want the
subdirectories, ignore any name that doesn't end in a '\' Character!

[Back to DIRS SWAG index]  [Back to Main SWAG index]  [Original]