The custom procedure FindFiles locates files in a given directory (folder) and its subdirectories, and adds their complete path to a stringlist. Note that recursion is used: FindFiles calls itself at the end of the procedure!The meaning of the parameters of FindFiles(FilesList, StartDir, FileMask) is as follows:
- FilesList is a stringlist, that you have to create before calling FindFiles. Afterwards, don't forget to free this stringlist.
- In StartDir you specify the starting directory, including the disk drive. If you want to search an entire disk, specify the root directory (root folder) of that disk, such as C:\ or D:\
- In FileMask you pass the name of the file to find, or a file mask with wildcards, such as ? and *
implementation .... // Recursive procedure to build a list of files procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string); var SR: TSearchRec; DirList: TStringList; IsFound: Boolean; i: integer; begin if StartDir[length(StartDir)] <> '\' then StartDir := StartDir + '\'; { Build a list of the files in directory StartDir (not the directories!) } IsFound := FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0; while IsFound do begin FilesList.Add(StartDir + SR.Name); IsFound := FindNext(SR) = 0; end; FindClose(SR); // Build a list of subdirectories DirList := TStringList.Create; IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0; while IsFound do begin if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then DirList.Add(StartDir + SR.Name); IsFound := FindNext(SR) = 0; end; FindClose(SR); // Scan the list of subdirectories for i := 0 to DirList.Count - 1 do FindFiles(FilesList, DirList[i], FileMask); DirList.Free; end; // Example: how to use FindFiles procedure TForm1.ButtonFindClick(Sender: TObject); var FilesList: TStringList; begin FilesList := TStringList.Create; try FindFiles(FilesList, EditStartDir.Text, EditFileMask.Text); ListBox1.Items.Assign(FilesList); LabelCount.Caption := 'Files found: ' + IntToStr(FilesList.Count); finally FilesList.Free; end; end;