| Excerpt |
|---|
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 *
| Code Block | ||
|---|---|---|
| ||
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; |
...