|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | ||||
| 
 | ||||
|  Список файлов в ListBox, надо модифицировать код Задача состоит в том чтобы считать список имен файлов нескольких разных типов в ListBox. В интернете нашел такой код: Код: procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var  SearchRec : TSearchRec;
begin if Mask = '' then Mask := '*.*';
  if StartDir[Length(StartDir)] <>  '\' then StartDir := StartDir + '\';
  if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
  begin
    repeat
    Application.ProcessMessages;
    if (SearchRec.Attr and faDirectory) <>  faDirectory then
      List.Add(StartDir + SearchRec.Name)
    else if (SearchRec.Name <>  '..') and (SearchRec.Name <>  '.') then
    begin
      List.Add(StartDir + SearchRec.Name + '\');
      ScanDir(StartDir + SearchRec.Name + '\',Mask,List);
    end;
    until FindNext(SearchRec) <>  0;
      FindClose(SearchRec);
    end;
end;Используется так: Код: ScanDir(<путь>,'',ListBox1.Items); Но эта процедура вместе с адресами файлов заносит в ListBox еще и адреса папок, что мне не нужно. К тому же она позволяет использовать только одну маску. Как сделать чтобы в ListBox заносились только адреса файлов, пропуская папки? И как изменить код чтобы использовать несколько масок? Я новичок в программировании, поэтому хотелось бы рассчитывать на подробный ответ, если это возможно. | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   удали, будет без папок.. Код: List.Add(StartDir + SearchRec.Name) | 
| 
			 
			#3  
			
			
			
			
		 | ||||
| 
 | ||||
|   Получилось наоборот: без файлов =) | 
| 
			 
			#4  
			
			
			
			
		 | ||||
| 
 | ||||
|   ой , пардон, поспешил вчера   . вот готовый код: Код: procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var
  SearchRec : TSearchRec;
begin
 if Mask = '' then Mask := '*.*';
 if StartDir[Length(StartDir)] <>  '\' then StartDir := StartDir + '\';
 if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
   begin
     repeat
      Application.ProcessMessages;
       if (SearchRec.Attr and faDirectory) <>  faDirectory then List.Add(StartDir + SearchRec.Name)
        else
         if (SearchRec.Name <>  '..') and (SearchRec.Name <>  '.') then
           begin
//           List.Add(StartDir + SearchRec.Name + '\');
           ScanDir(StartDir + SearchRec.Name + '\',Mask,List);
           end;
     until FindNext(SearchRec) <>  0;
   FindClose(SearchRec);
   end;
end;почитай хэлп - поймёшь почему я эту строку в комментарии отправил | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   По большому счёту можно и вообще по другому написать.. более кратко и красиво, но ты просил модифицировать   | 
| 
			 
			#6  
			
			
			
			
		 | ||||
| 
 | ||||
|   Спасибо большое! Я попросил модифицировать потому что думал, что так отниму меньше времени у знающего человека   . Так что делать, если надо использовать несколько масок (скорее всего из ini файла, но с этим проблем быть не должно)? Есть вариант прогнать процедуру несколько раз а затем сортировать список, но это мне кажется не очень рациональным решением. | 
| 
			 
			#7  
			
			
			
			
		 | ||||
| 
 | ||||
|   Похоже я не совсем верно понимал свою задачу. Во-первых мне не нужны файлы из вложенных папок, а только из той что дана. Сделать надо следующее: просканировать выбранную папку и занести в один листбокс файлы одних типов, используя список расширений, а в другой файлы других типов (аналогично). Есть идеи как это получше реализовать? | 
| 
			 
			#8  
			
			
			
			
		 | |||
| 
 | |||
|   Код: procedure SearchFiles(ASearchPath : String;
                               AListBox1 : TListBox; AExtList1 : Array Of String;
                               AListBox2 : TListBox; AExtList2 : Array Of String);
  function IsInList(AFileName : String; AExtList : Array Of String) : Boolean;
  var
    AExt : String;
    I : Integer;
  begin
    Result := False;
    AExt := ExtractFileExt(AFileName);
    For I := Low(AExtList) To High(AExtList) Do
      Begin
        Result := AnsiCompareText(AExt,AExtList[i]) = 0;
        If Result Then Break;
      End;
  end;
var
  iFound : Integer;
  F : TSearchRec;
begin
  ASearchPath := IncludeTrailingPathDelimeter(ASearchPath) + '*.*';
  iFound := FindFirst(ASearchPath,faAnyFile,F);
  While iFound = 0 Do
    Begin
      If (F.Attr And faDirectory) = 0 Then // Not a folder
        If (F.Name <> '.') And (F.Name <> '..') Then
           Begin
             If IsInList(F.Name,AExtList1) Then AListBox1.Items.Add(F.Name);
             If IsInList(F.Name,AExtList2) Then AListBox2.Items.Add(F.Name);
           End;
      iFound :=  FindNext(F);
    End;
  FindClose(F);
end;Принимает на вход: -путь, где искать файлы (папка) -первый ListBox; -массив расширений файлов, которые надо добавить в первый ListBox (в виде '.ext'); -второй ListBox; -массив расширений файлов, которые надо добавить во второй ListBox (в виде '.ext'); Пример испольхования: Код: procedure TForm1.Button1Click(Sender : TObject); var APath : Stirng; begin ListBox1.Items.Clear; ListBox2.Items.Clear; APath := ExtractFilePath(Application.ExeName); // Search in program's folder SearchFiles(APath,ListBox1,['.exe'.'.dll'],ListBox2,['.txt','.dat']); end; В примере в первый список попадают модули программы (exe и dll), во второй - текстовые файлы и файлы с данными. | 
| 
			 
			#9  
			
			
			
			
		 | ||||
| 
 | ||||
|   lmikle, cпасибо! Именно так, как мне было нужно. |