Soft

10.09.2010 Автор: Сергей Лосев Версия для печати

Поиск Windows

Помните WinFS? Похоже, только ленивый не упрекнул Microsoft в том, что компания так и не выполнила обещание выпустить эту файловую систему вместо существующих FAT/NTFS. Так ли это на самом деле — спорить не будем. Отметим только, что две последние буковки в этой аббревиатуре означают вовсе не file system, а future storage. То есть это некая оболочка поверх традиционной файловой системы, за которой прячутся не только стандартные атрибуты файлов (имя, расширение, атрибут, дата/время создания и т.п.), но и дополнительные, например: владелец, описание, теги.


Предполагалось, что WinFS предоставит альтернативный доступ к этим структурированным элементам: документам, контактам, почтовым сообщениям, изображениям и др., даст возможность отбирать документы по определенным критериям и устанавливать связи между документами. Несмотря на то что Windows Future Storage так и не увидел свет в виде конечного продукта, большая часть этой концепции была реализована в рамках поисковой системы Windows Search.

 

Как искать в Проводнике?

 Оценить поисковые возможности Windows можно в Проводнике. В нем рядом с адресной строкой непременно будет поисковая опция. Если набрать часть имени файла, то система довольно шустро отыщет нужные. Поисковые запросы могут быть не столь примитивны.

 В системе доступен язык Advanced Query Syntax, при помощи которого можно отбирать документы определенных типов (от папок до рисунков), созданных или использованных в определенное время и даже содержащих определенный текст. Вот, к примеру, как можно решить нашу задачку поиска изображений, сделанных ранее в текущем году: kind:=picture datemodi-fied:earlier this year. Этот текст достаточно ввести или вставить из буфера обмена в строку поиска и через несколько секунд получить результат.

 При ручном наборе Проводник будет подсказывать нужные параметры, предлагая выбирать их из списка.

 В общем виде синтаксис AQS выглядит следующим образом:[строка поиска] [<область поиска>: <значение>] [<тип файла>:<значение>] [<атрибут>:<значение>]

 Здесь сначала указывается некая строка, затем уточняются область поиска (папки, контакты, почтовые адреса), тип файлов (рисунки, документы, сообщения, контакты) и атрибуты (теги, автор, дата создания). В области поиска в параметре store можно сослаться на файлы (store:file), конкретные папки на жестком диске (folder:hardnsoft) или, к примеру, на почтовые сообщения Outlook (store:mapi). Некоторые программы могут расширять области поиска.

 При конструировании запроса доступны дополнительные опции. Еще со времен DOS в именах файлов можно использовать маски «?» и «*». Первая заменяет один символ, вторая — произвольное число символов. Для отбора одного из нескольких значений указывается OR, например author:(petrov OR sidorov) отыщет документы, созданные пользователями с указанными именами. Исключить строку из поиска позволит NOT или «-» (тире) — news NOT crisis, или news-crisis отбирает документы, содержащие news, но без crisis. Несколько значений объединяются AND (обратите внимание, что OR, NOT и AND всегда пишутся прописными) или «+» (плюс) — news AND crisis отыскивает файлы с news и crisis одновременно.

 В запросах с использованием дат или числовых значений допускается применять операции сравнения больше-меньше: size:>10000 ищет файлы, размер которых более 10000 байт, а также интервал значений: date:05/05/2009.. 10/10/2009. Для дат набор команд расширен — можно искать файлы не только на определенную дату или интервал, но и относительно текущего момента, например: «в прошлом месяце» (date:past month), «на этой неделе» (date:this week), «вчера» (date:yesterday) и т.п.

 Следующий параметр — это тип или, точнее, вид файлов. Для него в поисковой системе Windows есть целый ряд обозначений, который позволяют отбирать документы (kind:=docs), аудиофайлы (kind:=music — отметим, что Windows понимает далеко не все форматы, по умолчанию «цепляются» MP3, WMA, WAV), изображения (kind:=pics), видео (kind:=videos), приложения (kind:=programs) и т.п. Как только в поисковую строку вводится параметр kind, Проводник отображает полный перечень всех атрибутов — это изрядно упрощает составление запросов. Неизвестные системе виды файлов можно искать по расширениям, скажем, запрос ext: .FLA* OR APE OR .CUE выведет loss-less-аудио и CUE-описания треков.

 Пожалуй, самая полезная возможность — это поиск по тегам, темам, заголовкам и другим реквизитам. Даже если файлы «валяются» в одном каталоге, задаваемые в поиске атрибуты позволяют быстро фильтровать списки и получать в итоге только то, что требуется. Для этого, впрочем, нужно предварительно заполнить атрибуты. Это можно сделать в любой файловой оболочке, интегрированной с Windows и отображающей контекстное меню.

 Для каждого документа настраиваются свойства (окно открывается по команде контекстного меню) — на вкладке Details доступен целый ряд атрибутов файлов. Тут можно определить его заголовок (title), тему (subject), теги (tags), ввести примечание, имя автора и ряд других реквизитов, которые зависят от типа файлов. Например, для изображений это информация о фотокамере и некоторых параметрах съемки. Заметим, что при переносе файлов с флеш-карты фотокамеры в компьютер большинство этих реквизитов заполнены на основе параметров Exchangeable Image File Format — сокращенно EXIF.

 Эти атрибуты используются и для поиска. Если, к примеру, применяются камеры различных производителей, то указав в поиске cameramodel:NIKON, можно отыскать кадры, сделанные аппаратами Nikon. Для документов (kind:=document) доступны такие дополнительные атрибуты, как комментарии (comments), владелец (document-manager), дата последнего сохранения (lastsavedby), для известных системе форматов аудиофайлов — практически все доступные теги, включая исполнителя (artist), альбом (album), жанр (genre), для изображений, помимо уже названных атрибутов, — ориентация (orientation), размеры (height, width, dimensions) и др. Все это позволяет довольно быстро фильтровать списки в Проводнике — на современных десктопах (с быстрыми процессорами и достаточным объемом оперативной памяти) поиск на 500-Гбайт винчестере происходит чуть ли не мгновенно.

 

Поиск изнутри

 Теперь о том, как Windows Search устроен изнутри. Соответствующие компоненты встроены в операционную систему, но чтобы воспользоваться ими, к примеру, из системы Visual Studio C# Express, доступной совершенно бесплатно с сайта Microsoft (www.microsoft.com/express), нужно загрузить соответствующий SDK (ссылка на файл — достаточно громоздкая, проще добраться до файлов с главной страницы, набрав в поисковой строке Windows Search SDK). На последнем шаге после создания нового проекта, основанного на Windows Forms, нужно только добавить ссылку на библиотеку Microsoft.Search.Interop, а в коде (если соответствующая команда не появилась) ввести строку «using Microsoft.Search.Interop;». Что будет делать наша программа? С ее помощью можно просматривать по годам, датам и числам часто используемые типы документов. Результат показан на рисунке. В рамках этой небольшой статьи не ставилась задача создать полнофункциональный инструмент для работы с документами — это лишь небольшая иллюстрация возможностей Windows Search. Тем не менее она позволяет упорядочивать файлы не по алфавиту или папкам, а по датам создания/использования. Такой подход помогает быстрее отыскивать нужные файлы и сразу видеть, что и когда редактировалось или менялось.

 Итак, главные блоки нашей утилиты — это вызов CSearchManager, составление запроса и считывание итоговых строк. SQL-запрос, который загрузит нужные документы, можно составить вручную, но лучше воспользоваться помощником, классом CSearchQueryHelper, который конструирует запрос автоматически. В QuerySelectColumns указываются названия попадающих в итоговый список полей (в нашем случае — полное и короткое имя файла и дата создания), в QuerySorting — поля для сортировки (в нашей задаче — упорядочиваем сначала по дате, потом пополному имени файла). А параметр QueryWhereRestrictions определяет, где происходит поиск и каких именно документов. Проще говоря, в нем указываются части SQL-запроса, которые должны располагаться после идентификатора WHERE. Расширения файлов перечисляются в строковой переменной searching в том же формате, что использовался нами при поиске в Проводнике (через OR). Далее — проще: формируем запрос методом GenerateSQLFromUserQuery(), исполняем его и в цикле перебираем строки (см. листинг 1).

Немного остановимся и на других частях программы — интерфейсе, событиях и построении списков файлов. Она опирается на компоненты Windows Forms (в Vista и Windows 7 можно применять более продвинутый GUI, в котором для описания интерфейса используется XML — он получил название Windows Presentation Foundation).

 Наше приложение очень простое и использует всего шесть интерфейсных элементов: дерево TreeView для вывода годов и месяцев в иерархическом виде, список ListView для отображения по группам файлов, разделитель SplitContainer, инструментальная панель ToolStrip с кнопкой для обновления списка и строка состояния StatusBar. Шестой элемент не совсем визуальный, это набор значков ImageList, на который ссылаются добавляемые в список строки (сами иконки, в общем-то, не проблема найти в Интернете — есть сайты, где они доступны свободно по GPL-лицензии, одним из значков мы и воспользовались). Создание всех этих элементов происходит программно при первой загрузке формы (событие Load), там же описываются события: смена строк в иерархическом и обычном списках, а также нажатие кнопки Панели инструментов для обновления списка.

 Одной из маленьких хитростей, использованных в нашей программе, является загрузка строк в локальные списки: treedata — для иерархического списка и listdata — для списка файлов. Делается это для того, чтобы при переходе заново не формировать запрос к Windows Search, а отображать то, что было сохранено в памяти. Для списка объявляются структуры listdata и treedata и одноименные переменные (см. листинг 2), добавляются отдельные элементы методом Add; для иерархического списка прежде выполняется проверка, не добавлялась ли ранее запись о годе и месяце — это позволяет избежать дублей (см. листинг 3). В обработчике события для перехода по ветвям дерева в try-блоке проверяется, что именно выбрано: год или вложенный в него месяц года. Затем происходит обновление списка ListView — он очищается и формируется заново. Поскольку данные берутся из памяти, происходит это быстро. В событии для кнопки refresh выполняются, по сути, те же действия, что и при первой загрузке окна приложения, то есть исполняется запрос и списки заполняются заново.

 Еще одна достаточно «громоздкая» процедура — это формирование ListView. Нужно не просто добавить строки, а отнести их к определенной группе (группы — одна из возможностей элемента управления ListView, достаточно часто используемая в Vista и Windows 7 для объединения одинаковых элементов списка). В нашем случае мы будем объединять документы, редактируемые в тот или иной день. Алгоритм таков: просматриваем локальный список listdata; если встречается новый день, то добавляем группу. В ином случае включаем в ListView элемент и ссылаемся на текущую группу — сказанное иллюстрируется кодом в листинге 4.

 Все листинги из этой статьи в текстовом виде можно найти на нашем диске. Воспользовавшись бесплатным Visual Studio C# Express можно откомпилировать и запустить программу. Она хранится в отдельной папке и открывается в среде разработки щелчком по файлу docx.sln — это файл проекта.


Назад в раздел

Текст сообщения*
Защита от автоматических сообщений

Читайте также