поиск файлов

  • Автор темы vital
  • Дата начала
V

vital

я пробовал так
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var SR:TSearchRec;
FindRes:Integer;
begin

FindRes:=FindFirst('путь\*.mp3',faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and 
((SR.Name='.')or(SR.Name='..')) then		 begin
FindRes:=FindNext(SR); 
Continue;
end;
form2.sListBox2.Items.Insert(form2.pathlst.Items.Count,sr.Name); 
form2.sListBox1.Items.Insert(form2.sListBox1.Items.Count,sr.Name);
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;

* во второй listbox должен добавляться путь вместе с именем..Как?
2.Алгоритм работает только в пределах одной папки, как заставить работать и с вложенными? хотя бы до 3 уровней..

зы.
кажись придумал решение второго, пошел пробовать.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Почему же, просто в очередной раз отвечать на самый ЧАВОшный вопрос особого желания нет.

Вот пример обхода дерева каталогов(вроде Delphist FAQ). Расширить его до твоего случая не составит труда.
Код:
Procedure ScanDir(Dir:string); 
var SearchRec:TSearchRec; 
begin 
if Dir<>'' then if Dir[length(Dir)]<>'\' then Dir:=Dir+'\'; 
if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then 
repeat 
if (SearchRec.name='.') or (SearchRec.name='..') then continue; 
if (SearchRec.Attr and faDirectory)<>0 then 
ScanDir(Dir+SearchRec.name) //we found Directory: "Dir+SearchRec.name" 
else 
Showmessage(Dir+SearchRec.name); //we found File: "Dir+SearchRec.name" 
until FindNext(SearchRec)<>0; 
FindClose(SearchRec); 
end;
 
V

vital

Kmet, то что привел ты делает оже самое что и то что привел в начале я, только понять сложнее..

Вопрос в том и состоит чтобы код, как ты сказал, 'расширить';
 
D

DCoder

Ну а в чём проблема? В коде, который предоставил Kmet, замени ShowMessage на Listbox2.Items.Add('путь\'+SR.name) (кстати, не пойму, зачем ты используешь процедуру Insert?). А также у меня возник вопрос по коду: если ты ищешь по маске 'путь\*.mp3', зачем оператор
Код:
if ((SR.Attr and faDirectory)=faDirectory) and 
((SR.Name='.')or(SR.Name='..')) then
По такой маске директория никогда не будет найдена.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Kmet, то что привел ты делает оже самое что и то что привел в начале я, только понять сложнее..

Вопрос в том и состоит чтобы код, как ты сказал, 'расширить';

Разница принципиальная, мой пример использует рекурсивный подход для обхода вложенный папок.
Твой ж просто проходит одну директорию, и дело тут даже не в маске, хотя она конечно тоже ошибочная.
 
V

vital

брр..чё-то я похоже, тупостей наделал..
DCoder, твой пример у меня работал только в пределах одной директории.

пс.
сори, наверно, всё так по моей тупости.. голова не варит..хм..после вчерашнего.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!