Difference between revisions of "FindAllFiles/ru"

From Free Pascal wiki
Jump to navigationJump to search
Line 33: Line 33:
 
   PascalFiles := TStringList.Create;
 
   PascalFiles := TStringList.Create;
 
   try
 
   try
     FindAllFiles(PascalFiles, LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //find e.g. all pascal sourcefiles
+
     FindAllFiles(PascalFiles, LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //находим, например, все исходные файлы паскаля
 
     ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
 
     ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
 
   finally
 
   finally
Line 39: Line 39:
 
   end;
 
   end;
  
// or
+
//или
  
 
begin
 
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
+
   PascalFiles := FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //находим, например, все исходные файлы паскаля
 
   try
 
   try
 
     ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
 
     ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
Line 51: Line 51:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''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:
+
Функция ''FindAllFiles'' создает внутренний список строк. На первый взгляд это может показаться очень удобным, но создать '''утечки памяти''' очень просто:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
   // DON'T EVER DO THIS !!!! - There is no way to destroy the stringlist created by FindAllFiles.
+
   // НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО !!!! - Нет способа уничтожить список строк, созданный [функцией] FindAllFiles.
 
   Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true);
 
   Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true);
 
</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}}
+
{{Note|Если вы хотите использовать эту функцию в программах командной строки, добавьте в требования проекта ''LCLBase'', которое не будет тянуть весь LCL.}}

Revision as of 21:26, 23 February 2019

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

Unit: Lazarus fileutil

См.также:

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 ищет файлы, соответствующие маске поиска, в каталоге SearchPath и, если указано, в его вложенных папках, и заполняет stringlist результирующими именами файлов.

Маска может быть единственной маской, которую вы можете использовать с функциями FindFirst/FindNext, или она может состоять из списка масок, разделенных точкой с запятой(;).
Пробелы в маске рассматриваются как литералы.

Есть две перегруженные версии этой процедуры. Первая из них представляет собой процедуру и предполагает, что получающий список строк уже создан. Вторая - это функция, которая создает список строк внутри себя и возвращает его как результат функции. В обоих случаях список строк должен быть уничтожен вызывающей процедурой.

Пример:

uses 
  ..., FileUtil, ...
var
  PascalFiles: TStringList;
begin
  PascalFiles := TStringList.Create;
  try
    FindAllFiles(PascalFiles, LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //находим, например, все исходные файлы паскаля
    ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
  finally
    PascalFiles.Free;
  end;

//или

begin
  //Нет необходимости создавать список строк; функция делает это для вас
  PascalFiles := FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true); //находим, например, все исходные файлы паскаля
  try
    ShowMessage(Format('Found %d Pascal source files', [PascalFiles.Count]));
  finally
    PascalFiles.Free;
  end;

ВАЖНОЕ ЗАМЕЧАНИЕ: Функция FindAllFiles создает внутренний список строк. На первый взгляд это может показаться очень удобным, но создать утечки памяти очень просто:

  // НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО !!!! - Нет способа уничтожить список строк, созданный [функцией] FindAllFiles.
  Listbox1.Items.Assign(FindAllFiles(LazarusDirectory, '*.pas;*.pp;*.p;*.inc', true);
Light bulb  Примечание: Если вы хотите использовать эту функцию в программах командной строки, добавьте в требования проекта LCLBase, которое не будет тянуть весь LCL.