Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #74, ФЕВРАЛЬ 2005 г.

Файлы в ассортименте

Диман Dr.X (xdiman@mail.ru)

Хакер, номер #074, стр. 074-108-4


Так или иначе, вся сортировка сводится к простому перемещению файлов. Для этого можно или написать процедуру, читающую данные из одного файла и записывающую в другой, или понадеяться на системную команду. Мы пойдем по второму пути, так как нам нужно не продолжительное копирование, а всего лишь изменение пути к файлу посредством move или mv (Windows, Unix - нужное подчеркнуть).

Теперь о самом процессе сортировки. Тут также ничего сложного нет. Вначале следует выделить расширение файла и посредством передачи ключа ассоциативному контейнеру получить название папки, в которую файл должен попасть. После этого имя файла разбивается на части пробелами, дефисами, точками и т.д. Затем поочередно к каждой части добавляется приоритет - от 10 до 1. Полученные строки в качестве ключей ассоциативного контейнера дадут итоговую папку, в которую будет помещен данный файл. После написания этого модуля остается сделать только самодополнение, делающее наш сортировщик пусть не уникальным, но чем-то выделяющимся среди остальных программ.

Пишем модуль самодополнения

Модуль самодополнения - самый сложный в программе. Прежде всего, нужно установить допустимый предел для повторяющихся слов в именах файлов, после которого их можно считать критерием для определения других файлов в эту папку. Пусть допустимый предел будет четыре повтора. Тогда определимся с принципом работы модуля. Необходимо получить список файлов всех подкатегорий основных типов данных, а далее на основе их анализа добавить критерий в список. Как я уже говорил, анализ имен файлов производится следующим образом. Имя файла разбивается на части с помощью разделяющих символов. Затем находятся общие части у разных имен. Если более чем у четырех файлов обнаружены одинаковые слова в имени, то все последующие файлы с этим словом в имени будут определены именно в эту папку. Приоритет же сортировки может варьироваться от 6 до 10 и изменяться в зависимости от количества файлов со схожими именами. Одной из главных процедур здесь является функция split, которая будет разбивать имя файла на части. Код этой функции ты можешь увидеть ниже.

Листинг функции split

int split(string &x, string delimeter, string* lines)

{

int j, k;

int i = 0;

// Для поиска первого символа из заданного набора

// используем функцию find_first_of

while (j=x.find_first_of(delimeter), j!=-1) {

lines[i] = x.substr(0, j);

x.erase(0, j+1); i++;

}

// Записываем оставшуюся часть в последний элемент массива

lines[i] = x; i++;

return i;

}

Функция работает следующим образом. Вначале производится поиск любого символа из заданного набора разделителей. После того как символ найден, в первый элемент массива lines записывается часть строки x от начала до разделителя, а затем эта часть из строки x удаляется и процедура повторяется. Когда в строке не останется ни одного символа-разделителя, оставшаяся часть записывается в последний элемент массива и функция завершает свою работу, возвращая количество разделенных частей. Также с помощью этой функции можно выполнять и другие действия, например выделение расширения из файла и т.д. Допустим, у нас имеется файл с именем corel_photo-paint.exe. В качестве первого параметра мы передаем это имя, в качестве второго - возможные разделители, например «-_ 2». Двойку я поставил сюда для обработки различных программ конвертирования, таких как htm2chm, exe2swf и т.д. И в качестве третьего параметра передаем указатель на массив типа string, память под который должна быть выделена заранее. На выходе мы получим следующее:

Назад на стр. 074-108-3  Содержание  Вперед на стр. 074-108-5