Главная » Delphi » Доработка программы Trace пример поисковой программы

0

Для того чтобы превратить нашу программу Тгасс из прошлой главы действительно в поисковую, т. е. выполняющую задачу просмотра текстовых файлов и выделения тех из них, в которых встречаются заданные слова и выражения, надо решить как минимум три основные задачи.

?      Выбрать собственно алгоритм поиска и решить проблему чтения различных форматов.

П Обеспечить поиск во вложенных папках. Тот, кто пытался найти что-то с помощью встроенного поиска Word (пункт Файл | Открыть), понимает, что поиск только в текущей папке— в общем, никому не нужная вещь. Для решения этой задачи нам придется научиться составлять дерево каталогов.

?      Обеспечить чтение файлов не с диска, а из памяти, пользуясь одним из способов, предлагаемых операционной системой. (О том, что ProgressBar тормозит процесс, постараемся забыть— в процессе собственно чтения файла он нам не мешается.) Ее решение, по соображениям наглядности (см. комментарий на эту тему в главе 13), мы оставим почти на самый конец.

Сначала поподробнее о первой задаче. В общем случае нам очень хотелось бы читать все возможные форматы, или. по крайней мере, главные — кроме просто текстовых (туда же относится и HTML), которые мы уже умеем читать в трех основных кодировках, это форматы DOC и RTF. Причем если читать их напрямую доморощенными способами (примерно так, как мы это делали в главе 8 для Unicode-текста), го дело осложняется тем, что и DOC и

RTF могут, вообще говоря, содержать и Unicode, и обычный plain text (в принципе и текст HTML в версии 4 тоже может содержать формат Unicode, но, слава богу, это встречается достаточно редко). В принципе изобретать ничего не требуется — достаточно воспользоваться услугами технологии СОМ (она же OLE) и просто переводить такие тексты в plain text методами Office, не вникая в их суть. То же относится и к XML, PDF или базам почтовых программ (напомним, что такие форматы вообще умеют читать только продвинутые поисковики типа Google Desktop Search). Кое-какие способы это сделать— со всеми их недостатками— мы укажем в главе 18, а пока ограничимся только текстовыми форматами.

Насчет третьей задачи напомню, что с самого начала мы пошли в части чтения не самым лучшим способом — читаем из дискового файла байт за байтом (ну ладно, слово за словом), как будто живем в эпоху DOS с ее 640 Кбайтами памяти (см. главу 8). Но сначала мы продолжим эту линию, и сделаем паллиативный, но зато простой и наглядный вариант специально "для чайников": после того как мы определили кодировку, мы прочтем (пока побайтно) содержимое файла в строку, а потом будем определять, имеется ли в ней вхождение искомой строки.

Для того чтобы оправдать свои труды и не повторять чужие достижения, а придать программе оригинальную функциональность, мы введем в нее возможность поиска любого из нескольких слов — функцию, которой очень не хватает в большинстве подобных программ. Когда в главе 18 мы узнаем про методы преобразования Word-форматов в текст, то доработанная с учетом этого программа может вполне претендовать на свое место среди подобных, как простая альтернатива навороченным поисковикам от того же Google. Отметим и крупнейший общий недостаток такой программы в сравнении с "фирменными" — поиск у нас будет осуществляться каждый раз заново. Оправданием тут служит то, что и встроенный поиск Windows, и утилиты сторонних производителей (например, встроенные в клоны Norton Commander) также не имеют средств для ускорения поиска. Центральным узлом "настоящей" поисковой системы, типа Яндекса или того же Google, является механизм предварительной индексации файлов и составления соответствующей базы данных, что намного ускоряет процедуру. Такой механизм всегда есть "ноу-хау" разработчиков, и можно только представить, как пришлось поломать голову создателям Google Desktop Search, чтобы размер этой базы оказался приемлемым. А изюминкой поисковой машины Яндекс, например, является поиск по словоформам — чего нет в многоязычной Google. Но в основном разработчики локальных систем действуют по нашему принципу — так, дабы максимально ускорить поиск в Windows ХР, в ней вообще решили "не замечать" файлы с "немикрософтовскими" расширениями (скажем, текстовый поиск по слову "uses" не покажет вам ни одного PAS-файла), что обессмысливает использование этой функции до полной ее непригодности, даже в сравнении с убогим аналогичным сервисом в Windows 9дг.

Итак, приступим к решению сначала второй задачи — как составить список всех вложенных папок?

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии