Mega Code Archive

 
Categories / Delphi / Files
 

Looking for files recursively in a directory or the hard disk

Title: Looking for files recursively in a directory or the hard disk Question: How can search a directory recursively? Answer: The following function receives as parameters a file specification (like for example 'C:\My Documents\*.xls' or 'C:\*' if you want to search the entire hard disk) and optionally a set of attributes (exactly as Delphi's FindFirst function), and it returs a StringList with the full pathnames of the found files. You should free the StringList after using it. interface function FindFile(const filespec: TFileName; attributes: integer = faReadOnly Or faHidden Or faSysFile Or faArchive): TStringList; implementation function FindFile(const filespec: TFileName; attributes: integer): TStringList; var spec: string; list: TStringList; procedure RFindFile(const folder: TFileName); var SearchRec: TSearchRec; begin // Locate all matching files in the current // folder and add their names to the list if FindFirst(folder + spec, attributes, SearchRec)=0 then begin try repeat if (SearchRec.Attr and faDirectory = 0) or (SearchRec.Name'.') and (SearchRec.Name'..') then list.Add(folder + SearchRec.Name); until FindNext(SearchRec) 0; except FindClose(SearchRec); raise; end; FindClose(SearchRec); end; // Now search the subfolders if FindFirst(folder + '*', attributes Or faDirectory, SearchRec) = 0 then begin try repeat if ((SearchRec.Attr and faDirectory) 0) and (SearchRec.Name'.') and (SearchRec.Name'..') then RFindFile(folder + SearchRec.Name + '\'); until FindNext(SearchRec) 0; except FindClose(SearchRec); raise; end; FindClose(SearchRec); end; end; // procedure RFindFile inside of FindFile begin // function FindFile list := TStringList.Create; try spec := ExtractFileName(filespec); RFindFile(ExtractFilePath(filespec)); Result := list; except list.Free; raise; end; end; Sample call ----------- You can try this function placing a ListBox and a button on a form and adding this code to the OnClick event of the button: procedure TForm1.Button1Click(Sender: TObject); var list: TStringList; begin list := FindFile('C:\Delphi\*.pas'); ListBox1.Items.Assign(list); list.Free; end;