Консультация № 25776
03.09.2005, 21:03
0.00 руб.
0 5 2
Помогите плиз. Использую юнит из приложения для поиска файлов по маске и диску. Область поиска целый диск. Происходит торомжение системы. Хотелось бы код с подобным принципом работы. Буду признателен за любую помощь.

Приложение:
unit search;interfaceuses Windows, SysUtils, Classes, Masks;procedure GetLogicalDriveList(const List: TStrings);procedure GetFixedDriveList(const List: TStrings);procedure FindFiles(Path, Mask: string; List: TStrings; IncludeSubDir: Boolean = True);implementationprocedure GetLogicalDriveList(const List: TStrings);varSize, Pos: Cardinal;Buffer: array[0..127] of AnsiChar;P: PChar;beginList.BeginUpdate;tryList.Clear;Size:=GetLogicalDriveStrings(SizeOf(Buffer), Buffer);Pos:=0;while Pos<Size do beginP:=@Buffer[Pos];List.Add(P);while Buffer[Pos]<>#0 do Inc(Pos);Inc(Pos);end;finallyList.EndUpdate;end;end;procedure GetFixedDriveList(const List: TStrings);varSize, Pos: Cardinal;Buffer: array[0..127] of AnsiChar;P: PChar;beginList.BeginUpdate;tryList.Clear;Size:=GetLogicalDriveStrings(SizeOf(Buffer), Buffer);Pos:=0;while Pos<Size do beginP:=@Buffer[Pos];if GetDriveType(P) = DRIVE_FIXED then List.Add(P);while Buffer[Pos]<>#0 do Inc(Pos);Inc(Pos);end;finallyList.EndUpdate;end;end;procedure FindFiles(Path, Mask: string; List: TStrings; IncludeSubDir: Boolean = True);varSearchRec: TSearchRec;FindResult: Integer;beginList.BeginUpdate;tryPath:=IncludeTrailingBackSlash(Path);FindResult:=FindFirst(Path+‘*.*‘, faAnyFile, SearchRec);trywhile FindResult = 0 do with SearchRec do beginif (Attr and faDirectory<>0) then beginif IncludeSubDir and (Name<>‘..‘) and (Name<>‘.‘)then FindFiles(Path+Name, Mask, List, IncludeSubDir);end else beginif MatchesMask(Name, Mask) then List.Add(Path+Name);end;FindResult:=FindNext(SearchRec);end;finallyFindClose(SearchRec);end;finallyList.EndUpdate;end;end;end.

Обсуждение

Неизвестный
03.09.2005, 21:09
общий
Тебе дать другой код но принцип работы такой же?
Неизвестный
03.09.2005, 21:19
общий
это ответ
Здравствуйте, CJ!
Всё у тебя правильно, только ЗАЧЕМ ты всё это выводишь в лист , да ещё в процессе?!?!?! В этом и дело.
Выполни этот же код без визуализации - поймёшь
а так делай 2 вещи с визуализацией:
1) не используй списки с добавлением по одному, при большом количестве они ОЧЕНЬ тормозят везде
2) добавляй всё когда поиск уже закончен если возможно
Неизвестный
03.09.2005, 21:41
общий
Да, но и скорость повыше хотелось бы.Тут поступило разумное мнение от JF : что-бы не лить все в лист сразу.
Неизвестный
03.09.2005, 21:44
общий
Забыл, в процес необходимо еще добавить одну строку кода, не помню какую, что-бы процесс можно было остановить. И еще, если можно, сори, прогресс поиска. Над этим я буду думать, но не откажусь от разумных предложений.
давно
Мастер-Эксперт
425
4118
04.09.2005, 04:51
общий
это ответ
Здравствуйте, CJ!
Попробуйте задать поиск файлов в отдельном потоке.
Если Вы запускали виндовый поиск, то могли заметить, что там поиск по всем дискам тоже идет не очень быстро. :)
Про организацию потока можно почитать здесь:
delphiworld.narod.ru
www.delphimaster.ru
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа