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

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

FindFirst, FindNext... Как быстрее?


Страницы:   1 2

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 идут именно такие ассоциации...


Страницы:   1 2

Наверх

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