Sign in Join
Wiki copytemporary

Revision 1 of 1, by Michalis on 4-26-2024. The page as it is now.

FindAllFiles

Unit: Lazarus fileutil.

To enable FileUtil in your project, please add LazUtils into required packages. Follow these steps:

See also:

pascal
procedure FindAllFiles(AList: TStrings; const SearchPath: String;
  SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); 

function FindAllFiles(const SearchPath: String; SearchMask: String = '';
  SearchSubDirs: Boolean = True): TStringList;

FindAllFiles looks for files matching the SearchMask in the SearchPath directory and, if specified, its subdirectories, and populates a stringlist with the resulting filenames.

The mask can be a single mask like you can use with the FindFirst/FindNext functions, or it can consist of a list of masks, separated by a semicolon (;).
Spaces in the mask are treated as literals.

Parameter DirAttr is int file attribute: if file-system item has this attribute(s), it is considered as a directory. It can be faDirectory, faSymLink, (faDirectory+faSymLink) or maybe another bits can be used.

There are two overloaded versions of this routine. The first one is a procedure and assumes that the receiving stringlist already has been created. The second one is a function which creates the stringlist internally and returns it as a function result. In both cases the stringlist must be destroyed by the calling procedure.

Example

pascal
uses 
  ..., FileUtil, ...
var
  PascalFiles: TStringList;
begin
  PascalFiles := TStringList.Create;
  try
    FindAllFiles(PascalFiles, LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //find e.g. all pascal sourcefiles
    ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
  finally
    PascalFiles.Free;
  end;

// or

begin
  //No need to create the stringlist; the function does that for you
  PascalFiles := FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //find e.g. all pascal sourcefiles
  try
    ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
  finally
    PascalFiles.Free;
  end;

Watch out for memory leaks, esp. with the FindAllFiles function

The function FindAllFiles creates the TStringList. This is convenient, but beware of memory leaks.

pascal
// DON'T DO THIS - the line below means that TStringList created by `FindAllFiles` is never freed.
Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true));

Fix it to this:

pascal
List := FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true);
try
  Listbox1.Items.Assign(List);
finally 
  List.Free;
end;

This unit is part of LCLBase

Note: If you want to use this function in command line programs, add a project requirement for LCLBase, which will not pull in the entire LCL


From the Free Pascal wiki, page "FindAllFiles", as it stood on 2024-04-26 after a change by Michalis, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.