Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];
ВнизFindFirst, FindNext... Как быстрее? Найти похожие ветки
← →
DevilDevil © (2009-08-10 11:24) [0]Время не засекал, потому что бесполезно.
Поиск как-то кешируется и в следующий раз осуществляется намного быстрее.
Суть вопроса.
Какой поиск быстрее: по всем файлам/папкам или по маске ?
Предполагаю, что поиск по маске - это поиск по всем файлам, только с фильтрафией внутри FindFirst/FindNext. Или я не прав и есть какой-то крутой механизм у них?
← →
DrPass © (2009-08-10 11:27) [1]Поиск по маске - это функция операционной системы, и FindFirst/FindNext в обоих случаях ничего сами не фильтруют, а просто передают ей параметры твоего запроса. Насчет крутых механизмов... ну, все стандартное. Дисковый кэш - это крутой механизм?
← →
DevilDevil © (2009-08-10 11:28) [2]Так ответ. Быстрее или нет? Если да, то насколько?
← →
Anatoly Podgoretsky © (2009-08-10 11:29) [3]
> Какой поиск быстрее: по всем файлам/папкам или по маске
> ?
А это от ситуации зависит, может и быстрее и медленнее. Кроме того основаная проблема это дисковые операции.
← →
DevilDevil © (2009-08-10 11:37) [4]Анатолий, я не понял
← →
Palladin © (2009-08-10 11:37) [5]
> [2] DevilDevil © (10.08.09 11:28)
что быстрее или нет?
← →
DevilDevil © (2009-08-10 11:44) [6]>Palladin
осуществляется поиск
Случай 1. Фильтрация по маске осуществляется внутри FindFirst/FindNext
Происходит перебор всех файлов. Если имя файла соответствует маске, то возвращается TSearchRec.
Перебор всех файлов в таком случае будет быстрее, т.к. не происходит фильтрации
Случай 2. Фильтрация по маске осуществляется каким-то мега супеп пупер алгоритмом, позволяющим не проходить по всем файлам.
В этом случае поиск будет быстрее.
Вопрос. Как осуществляется поиск: первым случаем или вторым?
← →
Anatoly Podgoretsky © (2009-08-10 11:49) [7]> DevilDevil (10.08.2009 11:44:06) [6]
Я уже ответил, что не понятного?
← →
DevilDevil © (2009-08-10 11:58) [8]От какой ситуации зависит?
От чего?
Каким способом осуществляется поиск: первым или вторым?
P.S. моя задача - максимально быстрый поиск jpg, jpe, jpeg, jfif, bmp - файлов.
Стараюсь понять, как сделать быстрее.
← →
Anatoly Podgoretsky © (2009-08-10 12:02) [9]> DevilDevil (10.08.2009 11:58:08) [8]
От количества файлов попадающих под условия, худший случай маски *.* - будут обработаны все файлы. Лучший случай, когда под условие попадает только один файл, с маской file.ext
Твоя задача подразумевает сделать это за один проход или за пять?
ЗЫ: без маски FindFirst не работает, никогда.
← →
DrPass © (2009-08-10 12:03) [10]
DevilDevil © (10.08.09 11:58) [8]
> P.S. моя задача - максимально быстрый поиск jpg, jpe, jpeg,
> jfif, bmp - файлов.
> Стараюсь понять, как сделать быстрее
Это же очевидно, что ни перебор по маске, ни перебор всех файлов не дадут тебе максимально быстрого поиска, не так ли? Сам же убедился, что особой разницы нет.
Быстрый поиск осуществляется предварительным индексированием
← →
DevilDevil © (2009-08-10 12:15) [11]>Anatoly Podgoretsky
>ЗЫ: без маски FindFirst не работает, никогда.
Верно. Но маска *.* широко распространена и вполне может оптимизироваться ОС, не используя фильтрацию вообще.
>Сам же убедился, что особой разницы нет.
не убедился
не производил замеров времени.
>Быстрый поиск осуществляется предварительным индексированием
?
← →
DevilDevil © (2009-08-10 14:07) [12]Ну хорошо
А как сформировать маску из нескольких расширений
Ну для jpg знаю - *.jpg. А для нескольких?
← →
Palladin © (2009-08-10 14:18) [13]*.* + ExtractFileExt
← →
Anatoly Podgoretsky © (2009-08-10 14:27) [14]> DevilDevil (10.08.2009 14:07:12) [12]
*.*
← →
qwer_qwer (2009-08-10 14:36) [15]
> DevilDevil © (10.08.09 11:24)
Разбери исходник этих функций и убедишься, что не имеет значения, используешь ты маску "*.jpg" или "*.*".
← →
DevilDevil © (2009-08-10 14:48) [16]>qwer_qwer
у тебя есть исходник FindFirst и FindNext ?
>Palladin ©
>Anatoly Podgoretsky ©Dir + "\*.jpg *.jpe *.jpeg *.jfif *.bmp
?
← →
Медвежонок Пятачок © (2009-08-10 14:54) [17]у тебя есть исходник FindFirst и FindNext ?
Он у всех есть.
А вот FindFirstFile - не у всех
← →
Palladin © (2009-08-10 14:55) [18]
> [16] DevilDevil © (10.08.09 14:48)
ты читать не умеешь? ах ну конечно, я забыл F1 добавить... у всех со словом ExtractFileExt идут именно такие ассоциации...
← →
DevilDevil © (2009-08-10 15:07) [19]>Palladin ©
Я не понял, что ты имел ввиду.
В помощи не нашёл
Мне бы пример маски на несколько разрешений.
Больше ничего не надо
← →
Anatoly Podgoretsky © (2009-08-10 15:11) [20]> DevilDevil (10.08.2009 15:07:19) [19]
http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N157
← →
Kolan © (2009-08-10 15:13) [21]
{************************************************************}
{ }
{ 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.
Добавить цикл для нескольких расширений, я думаю, труда не составит?
← →
DevilDevil © (2009-08-10 15:16) [22]Хороший пример
Как раз показывает то, что вы перебираете все файлы
А я говорю, что быстрее в FindFirst задать маску
В этом вопрос
← →
DevilDevil © (2009-08-10 15:17) [23]> Kolan ©
Тоже *.* ищешь
← →
Медвежонок Пятачок © (2009-08-10 15:39) [24]мда. это не лечится.
← →
Медвежонок Пятачок © (2009-08-10 15:43) [25]Тоже *.* ищешь
Это перебор всех файлов.
Поиск по маске "все мои картинки" (какой бы она ни была) - это тоже перебор ВСЕХ файлов.
И другого просто быть не может.
← →
DevilDevil © (2009-08-10 16:02) [26]>Медвежонок Пятачок
это ты не лечишься
> Поиск по маске "все мои картинки" (какой бы она ни была)
> - это тоже перебор ВСЕХ файлов.
> И другого просто быть не может.
Все согласны? Нет способа задать маску на несколько разширений?
Если да, то не быстрее будет 5 поисков: каждый по своему разширению?
← →
Leonid Troyanovsky © (2009-08-10 16:04) [27]
> 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.
← →
Игорь Шевченко © (2009-08-10 16:06) [28]Kolan © (10.08.09 15:13) [21]
> другими потрахами
То ли Ленина не уважаешь, то ли не копированием, а чем-то другим занимаешься.
← →
Медвежонок Пятачок © (2009-08-10 16:07) [29]Все согласны? Нет способа задать маску на несколько разширений?
Ты на самом деле думаешь, что виндоус встретив твою маску не будет перебирать ВСЕ файлы, а сразу соединится с Центральным Мозгом Галактики, который сообщит ей готовый список файлов в твоем каталоге, которые удовлетворяют маске?
← →
Anatoly Podgoretsky © (2009-08-10 16:11) [30]> DevilDevil (10.08.2009 16:02:26) [26]
А рамках FindFirst нет возможностей, используй MatchesMask и небольшой цикл.
← →
{RASkov} © (2009-08-10 16:13) [31]> RecursionCount — бесполезный параметр, задайте 0.
:)
← →
Kolan © (2009-08-10 16:22) [32]Про Ленина — не понял. :)
← →
Leonid Troyanovsky © (2009-08-10 16:22) [33]
> Игорь Шевченко © (10.08.09 16:06) [28]
> > другими потрахами
> То ли Ленина не уважаешь
Игорь, sorry, напомни, please, где тут про ВИЛ?
Оговорку по фрейду отметили (один пих на уме:), но не догнали :)
--
Regards, LVT.
← →
DevilDevil © (2009-08-10 16:47) [34]Всем участникам спасибо.
особенно Anatoly Podgoretsky
← →
Игорь Шевченко © (2009-08-10 17:20) [35]Kolan © (10.08.09 16:22) [32]
Leonid Troyanovsky © (10.08.09 16:22) [33]
Да будь я негром преклонным годов,
и то без унынья и лени
Я русский бы выучил только за то...
← →
Sha © (2009-08-10 17:40) [36]> Kolan © (10.08.09 15:13) [21]
Если я правильно отследил отступы, в коде есть неточность:
FindClose может выполниться при неуспешном FindFirst.
← →
Дмитрий Белькевич (2009-08-10 21:00) [37]Быстрее всего разбирать mft руками. Пользую и всем рекомендую everything. Ищет практически моментально среди 750 тыс файлов на моём венике. Думаю, что mft расковыривает.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.006 c