![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FindFirst, FindNext... Как быстрее?
DevilDevil © (2009-08-10 11:24:00)Время не засекал, потому что бесполезно.
Поиск как-то кешируется и в следующий раз осуществляется намного быстрее.
Суть вопроса.
Какой поиск быстрее: по всем файлам/папкам или по маске ?
Предполагаю, что поиск по маске - это поиск по всем файлам, только с фильтрафией внутри FindFirst/FindNext. Или я не прав и есть какой-то крутой механизм у них?
Дмитрий Белькевич (2009-08-10 21:00:00) [1]Быстрее всего разбирать mft руками. Пользую и всем рекомендую everything. Ищет практически моментально среди 750 тыс файлов на моём венике. Думаю, что mft расковыривает.
Sha (2009-08-10 17:40:00) [2]> Kolan © (10.08.09 15:13) [21]
Если я правильно отследил отступы, в коде есть неточность:
FindClose может выполниться при неуспешном FindFirst.
Игорь Шевченко (2009-08-10 17:20:00) [3]Kolan © (10.08.09 16:22) [32]
Leonid Troyanovsky © (10.08.09 16:22) [33]
Да будь я негром преклонным годов,
и то без унынья и лени
Я русский бы выучил только за то...
DevilDevil (2009-08-10 16:47:00) [4]Всем участникам спасибо.
особенно Anatoly Podgoretsky
Leonid Troyanovsky (2009-08-10 16:22:00) [5]
> Игорь Шевченко © (10.08.09 16:06) [28]
> > другими потрахами
> То ли Ленина не уважаешь
Игорь, sorry, напомни, please, где тут про ВИЛ?
Оговорку по фрейду отметили (один пих на уме:), но не догнали :)
--
Regards, LVT.
Kolan (2009-08-10 16:22:00) [6]Про Ленина — не понял. :)
{RASkov} (2009-08-10 16:13:00) [7]> RecursionCount — бесполезный параметр, задайте 0.
:)
Anatoly Podgoretsky (2009-08-10 16:11:00) [8]> DevilDevil (10.08.2009 16:02:26) [26]
А рамках FindFirst нет возможностей, используй MatchesMask и небольшой цикл.
Медвежонок Пятачок (2009-08-10 16:07:00) [9]Все согласны? Нет способа задать маску на несколько разширений?
Ты на самом деле думаешь, что виндоус встретив твою маску не будет перебирать ВСЕ файлы, а сразу соединится с Центральным Мозгом Галактики, который сообщит ей готовый список файлов в твоем каталоге, которые удовлетворяют маске?
Игорь Шевченко (2009-08-10 16:06:00) [10]Kolan © (10.08.09 15:13) [21]
> другими потрахами
То ли Ленина не уважаешь, то ли не копированием, а чем-то другим занимаешься.
Leonid Troyanovsky (2009-08-10 16:04:00) [11]
> DevilDevil © (10.08.09 15:16) [22]
> Как раз показывает то, что вы перебираете все файлы
> А я говорю, что быстрее в FindFirst задать маску
Во-первых, задать несколько масок так и не удасться.
Во-вторых, в скорости проверки на соответствие имени маске
можно тягаться и с MS, хотя, конечно, нижний предел определен
скоростью дисковых операций.
See also:
http://groups.google.com/group/fido7.ru.delphi/browse_thread/thread/8c569e3e8d407b9a/32ddb7584e22e792?#32ddb7584e22e792
--
Regards, LVT.
DevilDevil (2009-08-10 16:02:00) [12]>Медвежонок Пятачок
это ты не лечишься
> Поиск по маске "все мои картинки" (какой бы она ни была)
> - это тоже перебор ВСЕХ файлов.
> И другого просто быть не может.
Все согласны? Нет способа задать маску на несколько разширений?
Если да, то не быстрее будет 5 поисков: каждый по своему разширению?
Медвежонок Пятачок (2009-08-10 15:43:00) [13]Тоже *.* ищешь
Это перебор всех файлов.
Поиск по маске "все мои картинки" (какой бы она ни была) - это тоже перебор ВСЕХфайлов.
И другого просто быть не может.
Медвежонок Пятачок (2009-08-10 15:39:00) [14]мда. это не лечится.
DevilDevil (2009-08-10 15:17:00) [15]> Kolan ©
Тоже *.* ищешь
DevilDevil (2009-08-10 15:16:00) [16]Хороший пример
Как раз показывает то, что вы перебираете все файлы
А я говорю, что быстрее в FindFirst задать маску
В этом вопрос
Kolan (2009-08-10 15:13:00) [17]
{************************************************************}
{ }
{ CommunicationInterface }
{ Copyright (c) 2009 KSoftWare }
{ }
{ }
{ Разработчик: Товеровский Николай }
{ www.ksoftware.ru }
{ Модифицирован: 23 июля 2009 }
{ Описание: Модуль для работы с файловой системой. }
{ }
{************************************************************}
unit KScanDirectory;
interface
uses
SysUtils, Classes, ShellAPI;
{Просканировать папку и найти в ней что-то, например файлы и папки
или просто файлы или просто папки или файлы но не все или...
Directory — папка в которой нужо искать.
ScanSubFolders — флаг поиска в подпапках.
Strings — результат поиска. Объект должен быть создан.
Extension — поиск файлов с определенным расширением,
если ограничений нет — оставьте пустым.
FileName — поиск файлов с определенным именем,
если ограничений на имя нет — оставьте пустым.
RecursionCount — бесполезный параметр, задайте 0.
SeachOnlyDirectorys — искать только папки.}
procedure ScanDirectory(Directory: string; ScanSubFolders: Boolean;
Strings: TStrings; Extension: string; FileName: string;
RecursionCount: Integer; SeachOnlyDirectorys: Boolean = False);
{Скопировать папку с подпапками и другими потрахами.}
procedure CopyDirectoryTree(AHandle: THandle;
AFromDir, AToDir: string);
{Скопировать файл.}
procedure CopyFile(AHandle: THandle;
AFromFileName, AToFileName: string);
implementation
procedure ScanDirectory(Directory: string; ScanSubFolders: Boolean;
Strings: TStrings; Extension: string; FileName: string;
RecursionCount: Integer; SeachOnlyDirectorys: Boolean = False);
var
CurrentFile: TSearchRec;
begin
Directory := IncludeTrailingPathDelimiter(Directory);
if Assigned(Strings) and DirectoryExists(Directory) then
begin
try
if FindFirst(Directory + '*.*', faAnyFile, CurrentFile) = 0 then
begin
repeat
if (CurrentFile.Name <> '.') and (CurrentFile.Name <> '..') then
begin
if ((CurrentFile.Attr and faDirectory) <> 0) and ScanSubFolders then
ScanDirectory(Directory+CurrentFile.Name, ScanSubFolders, Strings,
Extension, FileName, RecursionCount + 1, SeachOnlyDirectorys);
if (Extension = '') or (ExtractFileExt(CurrentFile.Name) = Extension) then
if (FileName = '') or (FileName = CurrentFile.Name) then
if (not SeachOnlyDirectorys) or ((CurrentFile.Attr and faDirectory) <> 0) then
Strings.Add(Directory+CurrentFile.Name)
end;
until FindNext(CurrentFile) <> 0;
end;
finally
FindClose(CurrentFile);
end;
end;
end;
procedure CopyDirectoryTree(AHandle: THandle; AFromDir,
AToDir: string);
var
SHFileOpStruct: TSHFileOpStruct;
begin
with SHFileOpStruct do
begin
Wnd := AHandle;
wFunc := FO_COPY;
{Про #0 не надо забывать.}
pFrom := PChar(AFromDir+ #0);
pTo := PChar(AToDir+ #0);
fFlags := FOF_NOCONFIRMATION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation(SHFileOpStruct);
end;
procedure CopyFile(AHandle: THandle;
AFromFileName, AToFileName: string);
begin
CopyDirectoryTree(AHandle, AFromFileName,
AToFileName);
end;
end.
Добавить цикл для нескольких расширений, я думаю, труда не составит?
Anatoly Podgoretsky (2009-08-10 15:11:00) [18]> DevilDevil (10.08.2009 15:07:19) [19]
http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N157
DevilDevil (2009-08-10 15:07:00) [19]>Palladin ©
Я не понял, что ты имел ввиду.
В помощи не нашёл
Мне бы пример маски на несколько разрешений.
Больше ничего не надо
Palladin (2009-08-10 14:55:00) [20]
> [16] DevilDevil © (10.08.09 14:48)
ты читать не умеешь? ах ну конечно, я забыл F1 добавить... у всех со словом ExtractFileExt идут именно такие ассоциации...