Файлы в ассортименте Диман Dr.X (xdiman@mail.ru) Хакер, номер #074, стр. 074-108-1 Пишем умный сортировщик с использованием STL Интересно, сколько места на диске занимает у тебя папка Downloads? У меня – 1,2 гигабайта. И это далеко не предел. В большинстве случаев все файлы - изображения, mp3, программы, исходники - лежат кучей в одном каталоге. Можно использовать специальные программы для сортировки всего этого добра, но гораздо веселее будет написать свой мини-сортировщик. В этой статье я расскажу тебе, как с помощью STL (специальной библиотеки, включенной в стандарт языка С++) создать утилиту для быстрой сортировки файлов. Также я расскажу, как увеличить функциональность сортировщика с помощью интеллектуального анализа имен файлов, что будет отличать его от ряда подобных программ. Не забудь сразу открыть исходник с диска, потому что основной код находится именно там :). Критерии сортировки Критерии, по которым выполняется сортировка файлов по каталогам, - самое главное в сортировщике. Самым простым критерием является расширение. По нему можно почти всегда определить тип файла, будь это бинарник, текстовик, графика или что-либо еще. Возможна и проверка первых трех байтов файла; например, исполняемые файлы в начале всегда имеют сигнатуру MZ (для различения exe и dll это не покатит, потому что инициалы Марка Збиковски используются и там. – Прим. Dr.). Мы ограничимся расширением и выделим четыре основных категории файлов: исполняемые, графические, текстовые и мультимедийные. Соответственно, в папке для сортировки должны быть каталоги для помещения конкретного типа файлов. Критерии будут храниться в корневом каталоге, в файлах с именами папок для сортировки и расширением, например, *.msl. Сортировка будет иметь два уровня. В отличие от только что рассмотренного первого уровня, второй более специфичен. На этом этапе все программы, например, сортируются по отдельным признакам: для работы с графикой, текстом, мультимедиа и т.д. Также на втором уровне, в отличие от первого, появляется приоритетная сортировка. Понятие приоритетной сортировки При использовании большого количества критериев может возникнуть такая ситуация, при которой файл будет принадлежать нескольким критериям сразу, то есть иметь в себе признаки принадлежности как одного, так и другого подтипа файлов. Чтобы избежать подобного, следует ввести понятие приоритетной сортировки. Приоритет можно указывать через пробел после основного критерия в десятибалльной системе. Низший приоритет будет оцениваться единицей, а высший - десятью баллами. При этом в ситуации, описанной выше, ставка делается на тот файл, который имеет высший приоритет. Но все же приоритетной сортировки не совсем достаточно, так как она будет все равно распределять файлы по жестко заданным правилам. Обойти это ограничение сортировщику поможет самодополнение. Принцип самодополнения Самодополнение является пополнением списка критериев путем анализа уже отсортированных файлов. Принцип этого замечательного свойства таков: все файлы, отсортированные в какой-либо каталог, анализируются на наличие в имени файла каких-либо сходных признаков, и если этот признак наблюдается у достаточного количества файлов, то он тоже может служить критерием для помещения в этот каталог. Приоритет вычисляется в зависимости от количества файлов, у которых найден данный признак. Ярким примером могут служить две программы: CorelDRAW и Corel PhotoPaint. Они обе будут отсортированы вначале в папку с программами, затем в папку с программами для работы с графикой, причем по разным признакам. А так как слово Corel повторяется в них, допустим, дважды, то оно может быть использовано в качестве критерия для программ, работающих с графикой. И сортировщик будет считать, что фирма Corel занимается только созданием графических пакетов. Поэтому минимально допустимое количество фалов со сходным признаком надо устанавливать в пределах разумного. Всю эту двухуровневую систему очень сложно будет представить в виде массивов и переменных, поэтому мы воспользуемся средствами, которые представляет нам библиотека STL, давно ставшая частью языка. |