![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск файлов
Ezhik © (2004-09-24 01:52:00)Добрый вечер. У меня есть рекурсивная функция, которая ищет все файлы и папки в заданой дериктории и поддериктории. Указиваю я начальную дерикторию с помошью компоненты DirectoryList. Эта функция визивается при событии DirectoryListBox1Change. При креейте моей формы я задаю начальную дерикторию С:\ и сразу же вызивается обработчик события DirectoryListBox1Change, который в свою очередь вызивает мою функцию поиска. Буквально через несколько секунд весь найденый список файлов (уменя более 30000) уже передомною. Когда же я вручную меняю дерикторию, также происходит тот же сценарий, НО, ищет в томже С:\ более 2.5 мин. Как такое может быть??? :(
Вот моя функция:
procedure findall(dir:string);
var
rec: TSearchRec;
res: integer;
begin
res:=FindFirst(dir + '\*.*',faAnyFile,rec);
res:=findNext(rec);
While res=0 do
begin
if (rec.Attr=faDirectory) and ((rec.Name='.')or(rec.Name='..')) then
begin
Res:=FindNext(rec);
Continue;
end;
if (rec.Attr= faDirectory) then
begin
Form1.StringGrid1.RowCount:= Form1.StringGrid1.RowCount + 1;
Form1.StringGrid1.Cells[1,Form1.StringGrid1.RowCount-2]:= '+ ' + dir + '\' + rec.Name + '\';
Form1.StringGrid1.Cells[0,Form1.StringGrid1.RowCount-2]:= 'Ïàïêà';
findall(dir + '\' + rec.Name);
Res:=FindNext(rec);
Continue;
end
else
begin
Form1.StringGrid1.RowCount:= Form1.StringGrid1.RowCount + 1;
Form1.StringGrid1.Cells[0,Form1.StringGrid1.RowCount-2]:= 'File';
Form1.StringGrid1.Cells[1,Form1.StringGrid1.RowCount-2]:= '- ' + dir + '\' + rec.Name;
Form1.StringGrid1.Cells[2,Form1.StringGrid1.RowCount-2]:= IntToStr(rec.Size);
if Form1.CheckBox1.Checked then
try
Form1.StringGrid1.Cells[3,Form1.StringGrid1.RowCount-2]:= DateTimeToStr(FileDateToDateTime(FileAge(ShortName+rec.Name)));
except
try
Form1.StringGrid1.Cells[3,Form1.StringGrid1.RowCount-2]:= DateTimeToStr(FileTimeToDateTime(rec.FindData.ftCreationTime));
except
Form1.StringGrid1.Cells[3,Form1.StringGrid1.RowCount-2]:= 'error';
end;
end;
end;
Res:=FindNext(rec);
Application.ProcessMessages;
if Application.Terminated then Break;
WaitForm.Caption:= IntToStr(Form1.StringGrid1.RowCount - 2);
end;
FindClose(rec);
end;
Ezhik (2004-09-24 17:49:00) [1]Удалено модератором
Примечание: Создание пустых сообщений
Ezhik (2004-09-24 02:11:00) [2]Правильно, но почему при креейте мгновенно, а при ручном изменении ооочень долго ищет??? Хоть последовательность таже и ничего лишнего.
DiamondShark (2004-09-24 02:02:00) [3]Так она попадает на директории . и .. и рекурсивно в них ищет.