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 , FindFiles will pass the path of all the Files it finds that match to the Procedure. if is True, all such Files in subdirectories beneath will be visited as well. if is False, the names of subdirectories in 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!