Difference between revisions of "FindAllFiles"
m |
(Add overloaded procedure. Warning of memory leaks.) |
||
Line 1: | Line 1: | ||
{{FindAllFiles}} | {{FindAllFiles}} | ||
− | Unit: Lazarus [[ | + | 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 | + | '''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, ... |
− | |||
− | ... | ||
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 | ||
− | + | 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:''' |
− | + | 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:
- http://lazarus-ccr.sourceforge.net/docs/lcl/fileutil/findallfiles.html
- http://lazarus-ccr.sourceforge.net/docs/lcl/fileutil/tfilesearcher.html
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);