Структура файла.
Файлы записываются в архив друг за другом. Структура одного куска такова: file_name|ByteFullFileLen|BitTreeKodeLen|tree_code|BitHufmenKodeLen|hufmen_code,
где
file_name - имя файла
ByteFullFileLen - длина в байтах всего последующего куска
BitTreeKodeLen - длина кода дерева Хаффмана в битах
tree_code - код дерева
BitHufmenKodeLen - длина закодированного файла в битах
hufmen_code - сам код файла
| - разделяющий символ ’|’
Структуры.
Code, включающая в себя
int KodeLen - длина кода в битах
unsigned long SymbKode - код символа
unsigned char symbol - сам символ ( далее везде используется именно беззнаковый char, но я буду опускать это).
Данная структура используется для хранения кодировок. Заводится массив code HufmenCode [256], куда и складывается кодировка.
Tree, включающая в себя
unsigned long fr - частота встречаемости символа
unsigned char symb - символ
tree *next - следующий в списке элемент
tree *left - левое поддерево
tree *right - правое поддерево
Структура предназначена для хранения дерева Хаффмана. Из данной структуры сначала составляется список, который затем преобразуется в дерево.
Границы работы программы.
Для записи частоты встречаемости символов в файле используется unsigned long, поэтому программа гарантируемо сжимает файлы до 8 Гб, где unsigned long переполняется, что приводит к неправильному построению кода. Еще одним ограничением является то, что код символов хранится также в unsigned long. Поэтому может содержать последовательность кода длиной 32. Но для появления кода длиной в 33 ячейки необходимо специфическое распределение частот символов. Они должны образовывать последовательность 1 1 2 4 8 25 26 … 231 232. Но тогда длина файла будет больше 8 Гб, следовательно, и здесь 8 Гб является границей.
Работа программы.
Программа может выполнять следующие операции:
-h вывести информацию о программе
-a arc.hfm file_1 file_2
… добавить в архив файлы или если архив ранее не
cуществовал – создать
его.
-x arc.hfm file_1 file_2 … разархивировать
файлы, не удаляя их из arc.hfm
-x arc.hfm извлечь все файлы, не удаляя архив
-d arc.hfm file_1 file_2 … удалить файлы из архива
-l arc.hfm распечатать имена всех файлов,
хранящихся в архиве
Добавление файлов в архив:
Если arc.hfm существует - открываем его, если нет – создаем пустой. Для каждого файла из file_1 file_2 … file_n выполняем:
проверяем, существует ли такой файл,
если нет, выводим сообщение и берем следующий файл, иначе идем далее,
убираем из названия путь к файлу,
проходим по архиву - проверяем, есть ли в архиве файл с таким названием,
если нет, то кодируем и записываем в конец архива,
если уже содержит, выводим сообщение и идем дальше.
Разархивация файлов:
Если нужно извлечь все файлы, то просто идем по файлу пока не достигнем конца и производим разархивацию. Если нужно извлечь определенные файлы, то идем по архиву – находим файл. Если не нашли – сообщаем об этом. Иначе, добавляем к названию директорию, где лежит архив, и производим разархивацию. И так для каждого файла. Перед непосредственно разархивацией проверяем, не существует ли уже этот файл, если да, то спрашиваем нужно ли его переписать.
Удаление файлов:
Сначала, чтобы зря не переписывать архив, для каждого файла проходим по архиву – ищем его. Не нашли - сообщаем. Если есть что удалять, то составляем список из файлов для удаления и отправляем его в функцию. Идем по архиву – ищем файлы. Если файл не нужно удалять - переписываем его в новый созданный архив. Если файл подлежит удалению, то просто сдвигаемся до следующего. Когда дошли до конца файла – удаляем старый, проверяем новый. Если тот пуст, то удаляем и его.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.