Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск директорий....


garry ©   (2002-07-15 12:49:00) 

Уважаемые, не подскажите как обыграть поиск файлов по нескольким вложенным директориям. Т.е. существует директория в которой ещё несколько директорий, во всех этих директориях необходимо найти файлы удовлетворяющие определённым требованиям и выполнить над этими файлами какое-то действие. Своего умишки хватает только на поиск в текущей директории...


delta   (2002-07-15 13:17:00) [1]

Вот ещё рабочий кусок кода. Ищет все файли на D с расширением р65
procedure Find (patch: string; Dirs: TStringList; Files: TStringList);
var SearchRec: TSearchRec;
begin
FindFirst(patch + "*.*", faAnyFile, SearchRec);
if (SearchRec.Attr=faDirectory) and (Copy (SearchRec.Name,1,1)<>".") then
Dirs.Add(patch + SearchRec.Name+"\")
else
if (
((ExtractFileExt(SearchRec.Name))=".p65") Or
((ExtractFileExt(SearchRec.Name))=".P65") )
then
Files.Add(patch + SearchRec.Name);


While FindNext(SearchRec)=0 do
if (SearchRec.Attr=faDirectory) and (Copy (SearchRec.Name,1,1)<>".") then
Dirs.Add(patch + SearchRec.Name+"\")
else
if (
//Copy (SearchRec.Name,1,1)<>"."
((ExtractFileExt(SearchRec.Name))=".p65") Or
((ExtractFileExt(SearchRec.Name))=".P65") )
then
Files.Add(patch + SearchRec.Name);
FindClose(SearchRec);
end;

procedure TForm1.Button1Click(Sender: TObject);
var d:integer;
Dirs:TStringList;
Files:TStringList;
begin
Dirs:= TStringList.Create;
Files:= TStringList.Create;
try
Find ("D:\",Dirs, Files);
d:=0;
While Dirs.Count<>d do begin
Find(Dirs[d],Dirs, Files);
d:=d+1;
end;
For d := 0 To Files.Count - 1 Do
ListBox1.items.add (IntToStr(d+1)+" " + Files [d]);
finally
Dirs.Free;
Files.Free;
label1.Caption:= ("Найдено "+ IntToStr (ListBox1.Count) + " файла(ов)");
end;
end;


still   (2002-07-15 12:59:00) [2]

Обычно такие вещи делаются рекурсивными процедурами.
Т.е. у процедуры входной параметр - имя директории, в которой надо искать. Если при поиске находишь директорию, то вызываешь ту же процедуру с другим параметром.
Алгоритм примерно такой:

procedure Find(Dir: string);
var
файл
begin
while not НайтиНЕУдалось(Dir)
begin
файл := НайтиСледФайл(Dir);
if IsDirectory(файл) then Find(Dir+файл)
else ОперацияСФайлом(файл);
end;
end;


Советую почитать книжки на эту тему.


Виктор Щербаков   (2002-07-15 12:57:00) [3]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо