Difference between revisions of "FindAllFiles"

From Lazarus wiki
Jump to navigationJump to search
m
(Add overloaded procedure. Warning of memory leaks.)
Line 1: Line 1:
 
{{FindAllFiles}}
 
{{FindAllFiles}}
  
Unit: Lazarus [[fileutil]] (UTF-8 replacements for FPC RTL code and additional file/directory handling)
+
Unit:  
 +
Lazarus [[LazFileUtils]] (UTF-8 replacements for FPC RTL code and additional file/directory handling)
  
 
See also:
 
See also:
Line 8: Line 9:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
 +
procedure FindAllFiles(AList: TStrings; const SearchPath: String;
 +
  SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory);
 +
 
function FindAllFiles(const SearchPath: String; SearchMask: String = '';
 
function FindAllFiles(const SearchPath: String; SearchMask: String = '';
 
   SearchSubDirs: Boolean = True): TStringList;
 
   SearchSubDirs: Boolean = True): TStringList;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''findallfiles''' looks for files matching the searchmask in the SearchPath directory and if specified its children and returns a stringlist with the resulting filenames.
+
'''findallfiles''' looks for files matching the searchmask in the SearchPath directory and if specified its children and populates a stringlist with the resulting filenames.
  
 
The mask can be a single mask like you can use with the FindFirst/FindNext functions,
 
The mask can be a single mask like you can use with the FindFirst/FindNext functions,
Line 18: Line 22:
 
Spaces in the mask are treated as literals.
 
Spaces in the mask are treated as literals.
  
Example:
+
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:'''
 
<syntaxhighlight>
 
<syntaxhighlight>
 
uses  
 
uses  
...
+
  ..., LazFileUtils, ...
fileutil
 
...
 
 
var
 
var
 
   PascalFiles: TStringList;
 
   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
 
begin
 
   //No need to create the stringlist; the function does that for you
 
   //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
 
   PascalFiles := FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //find e.g. all pascal sourcefiles
  try
+
     ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
     showmessage(Format('Found %d Pascal source files',[PascalFiles.Count]));
 
 
   finally
 
   finally
 
     PascalFiles.Free;
 
     PascalFiles.Free;
Line 36: Line 51:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{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}}
+
'''IMPORTANT NOTE:'''
<br>
+
The ''function'' "FindAllFiles" creates the stringlist internally. This may look very convenient at first sight, but it is very easy to create '''memory leaks''' that way:
 +
 
 +
<syntaxhighlight>
 +
  // DON'T EVER DO THIS !!!! - There is no way to destroy the stringlist created by FindAllFiles.
 +
  Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true);
 +
</syntaxhighlight>
 +
 
 +
{{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}}

Revision as of 23:03, 21 July 2017

English (en) español (es) suomi (fi) français (fr) polski (pl) русский (ru)

Unit: Lazarus LazFileUtils (UTF-8 replacements for FPC RTL code and additional file/directory handling)

See also:

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 children 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.

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:

uses 
  ..., LazFileUtils, ...
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
    ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
  finally
    PascalFiles.Free;
  end;

IMPORTANT NOTE: The function "FindAllFiles" creates the stringlist internally. This may look very convenient at first sight, but it is very easy to create memory leaks that way:

  // DON'T EVER DO THIS !!!! - There is no way to destroy the stringlist created by FindAllFiles.
  Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true);
Light bulb  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