Difference between revisions of "FindAllFiles"
m (FileUtils -> FileUtil) |
|||
(2 intermediate revisions by 2 users not shown) | |||
Line 8: | Line 8: | ||
* http://lazarus-ccr.sourceforge.net/docs/lcl/fileutil/tfilesearcher.html | * http://lazarus-ccr.sourceforge.net/docs/lcl/fileutil/tfilesearcher.html | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
procedure FindAllFiles(AList: TStrings; const SearchPath: String; | procedure FindAllFiles(AList: TStrings; const SearchPath: String; | ||
SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); | SearchMask: String = ''; SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory); | ||
Line 16: | Line 16: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | '''FindAllFiles''' looks for files matching the | + | '''FindAllFiles''' looks for files matching the SearchMask in the SearchPath directory and, if specified, its subdirectories, and populates a [[TStrings|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, | ||
or it can consist of a list of masks, separated by a [[Semicolon|semicolon (;)]].<br> | or it can consist of a list of masks, separated by a [[Semicolon|semicolon (;)]].<br> | ||
Spaces in the mask are treated as literals. | 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|procedure]]''' and assumes that the receiving stringlist already has been created. | There are two overloaded versions of this routine. The first one is a '''[[Procedure|procedure]]''' and assumes that the receiving stringlist already has been created. | ||
The second one is a '''[[Function|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. | The second one is a '''[[Function|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 lang="pascal"> | ||
uses | uses | ||
..., FileUtil, ... | ..., FileUtil, ... | ||
Line 55: | Line 58: | ||
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: | 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> | + | <syntaxhighlight lang="pascal"> |
// DON'T EVER DO THIS !!!! - There is no way to destroy the stringlist created by FindAllFiles. | // 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); | Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); |
Revision as of 13:36, 31 July 2020
│
English (en) │
español (es) │
suomi (fi) │
français (fr) │
polski (pl) │
русский (ru) │
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 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
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;
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);