![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Задача состоит в том чтобы считать список имен файлов нескольких разных типов в 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) Нет повести печальнее на свете, чем повесть о заклиневшем Resete. ![]() |
#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; почитай хэлп - поймёшь почему я эту строку в комментарии отправил Нет повести печальнее на свете, чем повесть о заклиневшем Resete. ![]() |
#5
|
||||
|
||||
![]() По большому счёту можно и вообще по другому написать.. более кратко и красиво, но ты просил модифицировать
![]() Нет повести печальнее на свете, чем повесть о заклиневшем Resete. ![]() |
#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пасибо! Именно так, как мне было нужно.
|