{=============================================} { } { 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.