Документация на FreeArc 0.40

Введение_ 2

Цели создания_ 2

Установка в Windows 3

Установка в Unix_ 3

Формат командной строки_ 3

Список команд_ 4

Поиск файлов_ 4

Список опций_ 6

Задание опций_ 14

Подробности_ 14

Запросы к пользователю_ 14

Текстовые кодировки (charsets) 15

Обработка ошибок_ 15

Открытие файлов из Интернета_ 15

Шифрование данных_ 16

Защита и восстановление данных_ 17

Отличия от RAR_ 19

Технические ограничения_ 20

Настройка солид-сжатия_ 20

Сортировка файлов для солид-сжатия_ 21

Обновление солид-архивов_ 22

Настройка сжатия_ 23

Типы файлов_ 25

Мультимедиа-сжатие_ 26

Использование памяти_ 26

Максимальное сжатие_ 27

Детальное управление сжатием_ 28

Расшифровка алгоритма сжатия_ 28

Выбор алгоритмов сжатия_ 29

Параметры алгоритмов сжатия_ 31

Внешние компрессоры_ 35

Блочные алгоритмы_ 36

Конфиг-файл arc.ini 36

Секция [Compression methods] 37

Секции [External compressor] 38

Информация для разработчиков_ 39

Компиляция из исходников_ 39

Добавление в программу новых алгоритмов сжатия_ 40

#

# Введение

## Цели создания

Многие существующие в настоящее время архиваторы используют один-единственный алгоритм для реализации всего диапазона режимов сжатия – от самого быстрого до самого плотного. Это приводит к тому, что скорость работы архиватора в этих режимах отличается всего в 5-6 раз. При этом «крайние» режимы всё равно остаются малоэффективными, не давая большого выигрыша по скорости/сжатию по сравнению с режимом по умолчанию. Более того, один алгоритм сжатия просто не может одинаково хорошо подходить для различных типов данных. В результате продвинутым пользователям приходится держать под рукой целый набор архиваторов, выбирая наиболее подходящий из них в зависимости от конкретной стоящей задачи. Добавьте к этому то, что большинство архиваторов имеют многолетнюю историю, и из-за требований обратной совместимости используемые в них алгоритмы сжатия далеки от идеальных.

Поэтому я поставил перед собой задачу создать архиватор нового поколения, имеющий большой диапазон скоростей сжатия для решения разных задач – от 100 кб/с до 10 мб/с, и выжимающий на каждой скорости максимум возможного! Для решения этой задачи в FreeArc используются три лучших современных библиотеки сжатия – LZMA Игоря Павлова, PPMD Димы Шкарина и GRZipLib Ильи Гребнова. У каждой из них есть свои сильные стороны – GRZipLib быстро пакует, PPMD хорошо сжимает тексты, LZMA хорошо жмёт бинарные данные и имеет очень быструю распаковку. При упаковке FreeArc группирует файлы по типу данных (текстовые, бинарные, мультимедийные и т.д.) и выбирает для каждой из этих групп наиболее подходящий алгоритм сжатия. В результате пользователю обеспечивается:

· выбор наилучшего алгоритма сжатия, соответствующего заданной скорости упаковки

· выбор алгоритма сжатия, наиболее подходящего к конкретным упаковываемым данным

Причём, заметьте – всё это реализовано в рамках одного универсального архиватора, подходящего (я надеюсь J) на все случаи жизни.

Второй стоявшей передо мной целью было создание архиватора:

· надёжного

· легко переносимого на другие платформы

· легко расширяемого новыми возможностями (восстановление данных, поколения файлов, многотомность, GUI)

· cпособного быcтро и надёжно обрабатывать большие объёмы данных

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

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

## Установка в Windows

Для установки FreeArc на компьютер скопируйте файлы arc.exe, arc.groups и arc.ini в каталог, включённый в PATH (все они должны находиться в одном каталоге).

Для добавления в FAR возможности работы с архивами, создаваемыми FreeArc, нужно найти в FAR каталог форматов плагина MultiArc (...\Program Files\Far\Plugins\MultiArc\Formats) и скопировать в него FreeArc.fmt. Если он вдруг не работает – можно использовать альтернативный способ подключения, описанный в файле FAR_MultiArc.addon.

Для подключения к Total Commander установите плагин MultiArc и затем импортируйте MultiArc add-on – файл freearc.addon (для этого нужно поставить курсор на любой файл, нажать Alt-F5, «Настройка», «Импорт addon-а» и указать путь к freearc.addon). Помимо этого, необходимо скопировать в PATH файл unarc.exe

## Установка в Unix

Запустите “make install”. Эта команда скопирует все необходимые файлы. Конфиг-файлы (arc.ini и arc.groups) будут помещены в каталог /etc, где вы их в дальнейшем можете редактировать.

#

# Формат командной строки

Работа с FreeArc сделана максимально похожей на работу с консольными версиями RAR и 7-Zip. FreeArc имеет тот же формат командной строки, использует совместимые с ними имена команд и опций (предпочтение отдаётся RAR как более распространённому), и вообще «ведёт» себя так же, как вы привыкли ожидать от этих программ. Поэтому большая часть возможностей FreeArc изложена мной кратко, подробного описания удостоились только уникальные возможности программы.

Формат командной строки далеко не уникален J:

arc Команда Архив [Имена файлов...] [@Файлы-списки...] [Опции...]

Имена файлов могут быть заданы масками с использованием общепринятых обозначений “?” и “*”. Указывать имена обрабатываемых файлов необязательно, по умолчанию используется маска “*”, задающая обработку всех файлов. Имена/маски обрабатываемых файлов могут также читаться из файлов-списков, где они должны быть записаны построчно. Опции могут быть указаны в любом месте командной строки. Выше был приведён формат командной строки для выполнения одной команды. Можно задать выполнение сразу нескольких команд (по очереди), разделив их описания “;” с пробелами, например:

arc a ../archive2 -m2 -r -t ; a ../archive3 -m3 -r -t ; a ../archive4 -m4 -r –t

Настройки по умолчанию считываются из файла arc.ini, находящегося в одном каталоге с программой, и из переменной среды FREEARC. Вы можете отключить их использование или выбрать другие настройки опциями -cfg и -env.

## Список команд

a | Добавить файлы в архив. Файлы с такими же именами, уже существующие в архиве, будут перезаписаны
c | Задать комментарий к архиву. Эквивалентна команде ch –z
ch | Скопировать архив, внося в него попутно изменения. Например, этими изменениями могут быть добавление комментариев к архиву, его закрытие от дальнейших изменений и т.д. Если в командной строке указаны имена файлов, то копируются только эти файлы. Файлы, указанные в опции -x, исключаются из архива (можно сказать, что команда ch оставляет в архиве в точности те же файлы, которые команда d удалила бы J). В отличие от RAR, эту команду можно использовать для переупаковки архива с новыми опциями, например arc ch archive -m5
create | Создать новый архив. Удаляет архив с заданным именем, если он уже существует, и затем действует как команда a
cw | Записать комментарий архива в файл: arc cw archive outfile.txt
d | Удалить файлы из архива
e | Извлечь файлы из архива в текущий каталог (или каталог, указанный опцией –dp)
f | Обновить файлы в архиве. Эквивалентно команде a -f
j | Объединить архивы. Файлы, указанные в командной строке, должны быть архивами. Их содержимое будет добавлено к основному архиву. Если в основном архиве и одном из добавляемых есть файлы с одинаковыми именами, то в объединённом архиве останется только файл из добавляемого архива. «Исходный архив» может не существовать до начала выполнения команды, в этом случае произойдёт объединение уже существующих архивов с созданием нового. Примеры: arc j new.arc old1.arc old2.arc arc j new old[34] arc j All_Together c:\* -r
k | Закрыть архив от дальнейших изменений. Эквивалентно команде ch –k
l | Вывести список файлов в архиве
lb | Вывести список имён файлов, содержащихся в архиве (без дополнительной информации)
m | Переместить файлы и каталоги в архив. Эквивалентно команде a -d
mf | Переместить файлы в архив. Эквивалентно команде a -df
r | Восстановить повреждённый архив, используя recovery record
rr[NN] | Добавить recovery record к архиву. Эквивалентно команде ch –rr[NN]
t | Протестировать файлы в архиве, распаковывая их в память и проверяя CRC
u | Обновить файлы в архиве и добавить новые файлы. Эквивалентно команде a -u
v | Вывести технический листинг архива, предназначенный главным образом для архиваторных оболочек
x | Извлечь файлы из архива с полными путями

## Поиск файлов

Все команды можно разделить на две большие группы: для команд архивации и слияния архивов (a f u m mf create sync j) в командной строке задаются имена архивируемых файлов, находящихся НА ДИСКЕ; для всех остальных команд – удаления файлов в архиве, изменения архива, распаковки, тестирования и получения списка файлов в архиве – в командной строке задаются имена файлов, находящихся В АРХИВЕ.

Рассмотрим пример команды архивации: arc a backup makefile *.cpp *.h @projectfiles. При её выполнении сначала ссылки на файллисты (в данном случае это projectfiles) заменяются их содержимым. Файллисты могут содержать имена и маски файлов, записанные построчно, но не могут содержать опции. Далее, на диске ищутся файлы, соответствующие каждому указанному имени или маске. Если задана опция -r, то файлы, соответствующие каждому имени/маске, ищутся не только в текущем каталоге, но и его подкаталогах. Если спецификация файла включает имя каталога, то файлы ищутся в этом каталоге и всех его подкаталогах, например команда arc a sources rtl\*.c -r упакует все файлы с расширением C в каталоге RTL c его подкаталогами. Если в командной строке не указаны имена обрабатываемых файлов, например “arc a archive“, то автоматически используется маска “*”, т.е. архивируются все файлы в текущем каталоге (и его подкаталогах, если указана опция “-r”).

Имя архива также может быть задано маской, при этом ищутся все удовлетворяющие маске файлы в текущем (или заданном явно) каталоге. Скажем, команда “arc a c:\archives\* great.nfo“ добавит ко всем архивам, находящимся в каталоге c:\archives, файл great.nfo. Если имя архива, указанное в командной строке, не содержит “.”, то к нему автоматически добавляется стандартное расширение “.arc”; предотвратить это можно, используя опцию --noarcext.

Команда “j” во всём похожа на команды архивации, только в командной строке в ней указываются имена архивов, поэтому при отсутствии в этих именах “.” к ним также добавляется “.arc”. В частности, слить все архивы на диске C в один можно командой “arc j All_Together c:\* -r”.

При задании базового каталога на диске опцией –dp архивируемые файлы ищутся относительно этого каталога – точно так же, как если бы он был текущим.

Для всех остальных команд имена, указанные в командной строке, обозначают файлы в архиве. Ссылки на файллисты (@listfile) точно так же заменяются их содержимым. Если имя задано без указания каталога, то оно соответствует файлам в любых каталогах, к примеру *.txt включает и readme.txt и src\history.txt. Если имя задано с каталогом, то оно соответствует только файлам в этом каталоге – файлы в любых других каталогах, включая его подкаталоги, не подходят. При использовании опции --fullnames имена без каталогов соответствуют только файлам в корневом каталоге, т.е. *.txt уже не будет включать файл src\history.txt.

Имя обрабатываемого архива может быть задано маской, и к нему при отсутствии расширения автоматически добавляется “.arc”. Кроме того, опция “-r” в этих командах означает рекурсивный поиск в подкаталогах ОБРАБАТЫВАЕМЫХ АРХИВОВ. Так, команда “arc t c:\* -r” протестирует все архивы на диске C, а команда “arc d c:\* *.bak -r” – удалит из них файлы “*.bak”.

Опция –dp в этих командах означает тот каталог на диске, который будет рассматриваться как текущий при извлечении файлов из архива.

Для всех команд с помощью опции “-x” можно исключить часть из найденных файлов: так, опция “-xcommon.h” исключает файлы common.h, “-x*.bak” – все файлы с расширением “bak”, а “-x@exclude.lst” – все файлы, спецификации которых перечислены в файле exclude.lst. При этом, если имя/маска файла не включает символ “/” или “\”, то она сопоставляется с так называемым «базовым именем» файла (т.е. именем без каталога), иначе – с полным именем файла. Для исключения целого каталога используйте "-xdir/*".

Дополнительные критерии отбора обрабатываемых файлов могут быть заданы опциями -ac, -n, -sl, -sm, -ta, -tb, -tn, -to. При этом отбор по атрибутам файла пока действует только во время архивации, поскольку атрибуты файлов не сохраняются внутри архив.

Опция –ap задаёт базовый каталог внутри архива – т.е. при архивации он добавляется к именам упаковываемых файлов, а при распаковке удаляется из имён, а файлы, не входящие в этот каталог, полностью игнорируются.

В масках можно использовать обозначения “?” (обозначает любой символ), "*" (обозначает любую последовательность символов, в т.ч. пустую). В именах каталогов маски не допускаются.

Обрабатываемые командой архивы и временные файлы архиватора автоматически исключаются из обработки – т.е. нет опасности, что они будут добавлены в архив, или перезаписаны файлами, извлекаемыми из архива.

Если после операции обновления архива в нём не оказалось ни одного файла (например, все файлы были стёрты, или ни одного файла не было найдено для архивации, или ни один из архивируемых файлов не удалось открыть), то созданный архив удаляется.

## Список опций

Каждая опция имеет своё длинное имя, большинство опций – одновременно с этим ещё и короткое.

-ac | --ClearArchiveBit | Сбросить атрибут Archive у успешно упакованных/распакованных файлов на диске
-ad | --adddir | Добавить имя распаковываемого архива (без расширения) к имени каталога, куда будет происходить распаковка. Например, команда “arc x * -ad” распакует все архивы в текущем каталоге в подкаталоги с теми же именами. При использовании одновременно с опцией -dp имя архива добавляется в самом конце
-ae | --encryption | Задаёт алгоритм или последовательность алгоритмов, используемых для шифрования сжимаемых данных. Подробности см. в разделе Шифрование данных
-ag | --autogenerate | Автоматическая генерация имени архива. К имени, указанному в командной строке, добавляется информация о текущей дате и времени. Например, “backup.arc” -> “backup20050302114328.arc”. Можно также явно указать формат добавляемой к имени архива строки в формате Си-шной функции strftime()
-ao | --SelectArchiveBit | Выбрать при архивации только файлы с установленным атрибутом Archive (не работает при распаковке из-за того, что атрибуты файлов внутри архива пока не сохраняются)
-ap | --arcpath | Базовый каталог внутри архива
-cfg | --config | Настройки по умолчанию читаются из файла arc.ini и переменной среды FREEARC. Эта опция позволяет либо отключить их использование (-cfg-), либо задать другой ini-файл (-cfg=alternative.ini). Для использования другой переменной среды используйте опцию -env
-d | --delete | Удалить успешно сархивированные файлы и каталоги по окончании упаковки
-df | --delfiles | Удалить успешно сархивированные файлы по окончании упаковки (но не удалять каталоги)
-di | --display | Контролирует объём информации о процессе работы, выводимой программой. Эта опция задаётся набором символов, например --display=hnwrfts, где каждый символ включает вывод определённой порции информации: · h – номер версии архиватора · o – дополнительные опции, полученные из arc.ini/FREEARC · a – имя создаваемого архива · c – метод сжатия · m – объём используемой памяти · n – обычные сообщения (о создании sfx, удалении сжатых файлов и т.д.) · w – предупреждения (warnings) · r – сообщения о recovery record · f – итоговая информация о степени сжатия файлов · d – итоговая информация о степени сжатия каталога архива (выводится только если каталог > 10 кб) · t – итоговая информация о скорости сжатия · s – итоги итогов :) для команд, обработавших больше одного архива · k – сообщение “All OK” в конце работы · e – пустая строка в конце работы программы · $ - вывод отладочной информации на экран · # - вывод отладочной информации в логфайл По умолчанию используется настройка “hanwrftske”, опция –di без параметра включает вывод всей доступной информации (кроме отладочной). Обратите внимание, что в логфайл в любом случае пишется всё. Также можно включать и выключать вывод отдельных частей информации с помощью –di+… и –di–….
-dm | --dirmethod | Метод упаковки каталога архива и других служебных блоков. Все возможности аналогичны опции -m. По умолчанию -dm=lzma:1m. Если вы не хотите, чтобы каталог архива был упакован – используйте опцию -dm0. Учитывайте, что FAR MultiArc plugin может заходить только в архивы, каталоги которых упакованы методами lzma и storing (поскольку другие методы не дают для сжатия каталогов никаких преимуществ, их поддержка не была включена при сборке плагина).
-dp | --diskpath | Базовый каталог на диске. Например, команда “arc x archive -apdir1 -dpdir2” извлечёт все файлы из каталога dir1 внутри архива в каталог dir2 на диске
-ds | --sort | Определить порядок сортировки файлов при архивации или отключить сортировку. Смотрите подробности в разделе Сортировка файлов для солид-сжатия Error! Bookmark not defined..
-ed | --nodirs | Не добавлять пустые каталоги в архив
-env |  | Опции по умолчанию читаются из переменной среды FREEARC. Эта опция позволяет либо отключить её использование (-env-), либо задать чтение опций по умолчанию из другой переменной среды (-env=VARNAME). Обратите внимание, что чтение опций из FREEARC также отключается при задании -cfg- (это сделано для удобства пользователей и совместимости с RAR)
-ep | --ExcludePath | Исключает часть пути из имени файла, записываемого в архив, или наоборот – расширяет его до полного имени файла на диске: · -ep0 – записывает голое имя файла без каталога · -ep1 – исключает из имени файла часть, заданную в командной строке · -ep2 – расширяет имя до полного имени файла на диске, за исключением “d:\” или “/” части · -ep3 – записывает полное абсолютное имя При распаковке абсолютные имена обрезаются, если не указана опция -ep3.
-f | --freshen | Обновить существующие файлы (при упаковке или распаковке)
-fn | --fullnames | В командах d, e, x, t, l, v имена файлов, указанные в командной строке, относятся к файлам внутри архива. При этом возникает вопрос – обозначают ли они полное имя файла или только имя без имени каталога? Ответ: если имя включает “/” или “\” или включена эта опция – то оно трактуется как полное имя
-hp | --HeadersPassword | Включение шифрования сжимаемых данных и заголовков архива и, опционально – задание пароля. Подробности см. в разделе Шифрование данных
-i | --indicator | Выбор индикатора прогресса: · -i0 – отключает вывод индикатора, в т.ч. в заголовке окна · -i1 – показывает только, на сколько процентов выполнено задание (настройка по умолчанию) · -i2 – дополнительно выводит имя каждого обрабатываемого файла аналогично тому, как это делается в большинстве архиваторов
-k | --lock | Закрыть создаваемый архив от дальнейших изменений
-kb | --keepbroken | При распаковке - не удалять файлы, при распаковке которых были обнаружены ошибки. Вы можете попытаться восстановить данные из этих файлов вручную. При упаковке – не удалять созданный временный файл архива, даже если в нём обнаружены ошибки
-kf | --keyfile | Задаёт файл-ключ, используемый для шифрования данных. Подробности см. в разделе Шифрование данных
-lc | --LimitCompMem | Ограничить объём памяти, используемый алгоритмом упаковки. По умолчанию программа использует не более 75% объёма физической памяти компьютера, но с помощью этой опции вы можете отменить ограничение или изменить его – см. Использование памяти
-ld | --LimitDecompMem | В командах, создающих архив, ограничивает объём памяти, который будет необходим для распаковки создаваемого архива. В командах распаковки может уменьшить требования к памяти, если алгоритм позволяет сохранять промежуточные данные на диск. По умолчанию –ld75%. См. Использование памяти
-m | --method | Метод сжатия. Опции -m1..-m9 устанавливают различные режимы упаковки – от самого быстрого и требующего всего 16 мб памяти, до самого медленного и использующего 4 гб и при упаковке, и при распаковке. Опции -m1x..-m9x включают ассиметричный алгоритм сжатия (LZMA), в котором для распаковки нужно в 10 раз меньше времени и памяти, но за это приходится платить уменьшением скорости упаковки и степени сжатия. В режимах m1/m2/m3/m4/m5 программа сжимает на уровне zip/uharc-mz/rar/7-zip/ccm, соответственно, работая при этом в 1.5-3 раза быстрее. Остальные подробности см. в разделе Настройка сжатия Error! Bookmark not defined.. Также традиционно поддерживается режим -m0 (отключение сжатия).
-max |  | Режим максимального сжатия с использованием встроенных и внешних алгоритмов (в настоящее время реализуется как –m9p с автоматическим уменьшением требований к памяти при необходимости)
-mc |  | Позволяет отключать отдельные алгоритмы сжатия и группы файлов, поддерживая в том числе RAR-совместимый синтаксис: -mct-, -mce- и т.д.. Подробности в разделе Мультимедиа-сжатие
-md | --dictionary | Задать размер блока/словаря для алгоритмов сжатия. Корректирует настройки алгоритмов, заданных в опции –m
-mm | --multimedia | Управляет мультимедиа-сжатием
-ms | --StoreCompressed | (Почти) не пытаться сжимать уже упакованные файлы. Какие файлы являются уже упакованными – определяется по их именам, так что здесь возможны ошибки и потому эта опция не включена по умолчанию. Подробности смотрите в разделе Типы файлов.
-mt | --MultiThreaded | Управление использованием многопоточности при упаковке/распаковке: · –mt0 – автоматический выбор оптимального количества тредов в зависимости от типа процессора (по умолчанию; также может быть задано как –mt+) · –mt1 – один тред (отключить многопоточность; также может быть задано как –mt–) · значения больше единицы – количество тредов, которые следует использовать На практике эта опция пока что влияет только на упаковку алгоритмом LZMA в режимах normal и выше (т.е. –m4 и выше), где при упаковке может использоваться два треда одновременно. Впрочем, многие процессы в программе и так распараллелены вне зависимости от значения этой опции – в частности, все алгоритмы, входящие в цепочку алгоритмов упаковки и распаковки, выполняются параллельно.
-mx |  | Режим максимального сжатия с использованием только встроенных алгоритмов (в настоящее время реализуется как –m9 с автоматическим уменьшением требований к памяти при необходимости)
-n | --include | Дополнительный отбор обрабатываемых фалов по именам/маскам. Например, команда: arc a a project1/* project2/* -n*.cpp -n*.h -n*.hpp отбирает в каталогах project1 и project2 только файлы с расширениями cpp, h и hpp. Можно использовать и файл-списки, заданные с помощью @filelist, например: arc a a project1/* project2/* -n@cppfiles.lst
-o | --overwrite | Режим перезаписи файлов при распаковке: · –op – выдавать запросы на перезапись (настройка по умолчанию; см. раздел Запросы к пользователю) · –o+ – не задавая запросы, перезаписывать все файлы (аналогично ответу “a”; –o+ –u аналогично ответу “u”) · –o– – не задавая запросы, пропускать все файлы (аналогично ответу “s”) То, какие файлы программа предложит перезаписать, также зависит от опций –f и –u.
-okf | --OldKeyfile | Задаёт старые ключевые файлы, используемые только для распаковки данных. См. раздел Шифрование данных
-op | --OldPassword | Задаёт старые пароли, используемые только для распаковки данных. См. раздел Шифрование данных
-p | --password | Включение шифрования сжимаемых данных и, опционально – задание пароля. Подробности см. в разделе Шифрование данных
-r | --recursive | Рекурсивный поиск заданных файлов в заданном (или текущем) каталоге и его подкаталогах
-rr | --recovery | Добавить к архиву recovery record заданного размера. Задаётся в виде: · –rrSIZE – добавить recovery record заданного размера в байтах, например –rr1mb · –rrN% или –rrNp – добавить recovery record с размером в процентах от величины архива, например –rr2% · –rr0% – добавить минимальную recovery record, достаточную для восстановления через Интернет · –rr– – отключить дальнейшее добавление recovery record Оптимальный размер recovery сектора подбирается автоматически. Его можно задать явно после точки с запятой, например –rr1%;4kb. Также можно задать явно и кол-во, и размер recovery секторов, например –rr4*64kb (имейте в виду, что recovery record при этом будет больше 256 кб, поскольку она также включает CRC секторов архива). Опция –rr0% эквивалентна –rr0%;4kb или, что то же самое, –rr0*4kb. Опция –rr без параметра задаёт использование recovery record с объёмом по умолчанию: 4% для архивов до 500 кб, 2% для архивов до 2 мб, 1% в остальных случаях (если в архиве уже есть recovery record, то будет использован прежний её объём). Использование recovery record позволяет восстановить последовательное повреждение архива, если оно не превосходит по размеру recovery record; при непоследовательном характере повреждений вероятность успешного восстановления уменьшается.
-s | --solid | Управляет размером солид-блока и разбиением на части каталога архива. По умолчанию размер солид-блока составляет 1 гб, а каталог разбивается на части, описывающие по 20 тысяч файлов. Опция –s16m изменит размер солид-блока на 16 мб, –s100f будет создавать солид-блоки по 100 файлов, а –se будет создавать отдельный солид-блок для каждого расширения файлов. Подробное описание этой опции см. в разделе Настройка солид-сжатия Error! Bookmark not defined..
-sc | --charset | Настраивает кодировки, используемые для листфайлов, файлов комментариев и т.д. Совместима по формату и с RAR, и с 7-zip. Подробности см. в разделе Текстовые кодировки (charsets)
-sl | --SizeLess | Отобрать файлы с размером строго меньше заданного. Примеры: -sl8m -sl5120
-sm | --SizeMore | Отобрать файлы с размером строго больше заданного (см. также –sl)
-t | --test | Протестировать созданный архив после упаковки. Дальнейшие действия, в том числе удаление сархивированных файлов, выполняются только при успешном результате тестирования. Архив, оказавшийся сбойным, стирается если не задана опция –kb
-ta | --TimeAfter | Отобрать файлы с временем модификации, равным или большим указанного. Параметр задаётся в формате YYYYMMDDHHMMSS, причём в него можно включать любые нецифровые символы для наглядности – они игнорируются. При недостаточном числе цифр производится дополнение нулями справа. Примеры: -ta2007-02-23 -ta2007-07-01_12:00 -ta2
-tb | --TimeBefore | Отобрать файлы с временем модификации, предшествующим указанному в параметре, во всём остальном аналогична опции –ta
-tk | --keeptime | Сохранить то время модификации архива, которое он имел перед операцией
-tl | --timetolast | Установить время модификации архива на время модификации самого свежего файла в архиве
-tn | --TimeNewer | Отобрать файлы, которые были изменены в течение заданного промежутка времени. Параметр записывается в формате [<ndays>d][<nhours>h][<nminutes>m][<nseconds>s]. Примеры: -tn7d -tn1h20m
-to | --TimeOlder | Отобрать файлы, которые не изменялись в течение заданного промежутка времени. В остальном аналогична опции –tn
-tp | --pretest | Режим тестирования архива перед выполнением операции над ним: · –tp0 – ничего не тестировать (также задаётся как –tp–) · –tp1 – проверять recovery record, при её отсутствии – ничего не делать (настройка по умолчанию) · –tp2 – проверять recovery record, при её отсутствии – тестировать архив (также задаётся как –tp и –tp+) · –tp3 – проверять recovery record и затем тестировать архив
-u | --update | Обновить существующие файлы и добавить новые (при упаковке или распаковке)
-w | --workdir | Задать каталог для временных файлов. При обновлении архива новая версия архива создаётся в этом каталоге, по окончании упаковки старый архив удаляется и на его место переносится этот файл. Если опции –t и –w используются одновременно, то тестирование созданного архива производится дважды – перед его переносом из временного каталога и после этого. Можно задать в виде ссылки на переменную среды, например –w%TEMP. –w без параметра эквивалентно –w%TEMP
-x | --exclude | Исключить из обработки заданные файлы или файлы из заданных файл-списков, например arc a backup -r -xcommon.h -x*.bak -x@exclude.lst -xdir/*. Подробности см. в разделе Поиск файлов.
-y | --yes | Автоматически отвечать «да» на все запросы к пользователю (удобно для unattended operation). См. Запросы к пользователю
-z | --arccmt | В командах, создающих архив, добавляет к архиву комментарий: · (по умолчанию) – комментарий копируется из исходного архива · –z– – комментарий удаляется при обновлении архива · –z – комментарий вводится с stdin · –zFILENAME – комментарий читается из заданного файла В командах распаковки (e/x/t) записывает комментарий архива в заданный файл (аналогично команде cw). Архивный комментарий выводится при всех операциях с архивом. Особенно большое значение он имеет для самораспаковывающихся архивов, поскольку выводится перед его распаковкой и позволяет пользователю решить, нужно ли ему распаковывать данный пакет
| --append | Добавлять новые файлы в конец архива, не переупаковывая существующие солид-блоки. В частности, таким образом можно создавать архив в несколько приёмов, используя разные опции на каждом шаге: arc a sfiction -r -s16m -m5b *.doc arc a sfiction -r -s1m -m4t -x*.doc --append См. Обновление солид-архивов
| --bypass | (Только в Windows) Задать список Интернет-серверов, загрузка файлов с которых должна идти напрямую, без использования proxy
| --cache | Задать размер кэша упреждающего чтения. Кэширование ускоряет архивацию большого кол-ва мелких файлов, когда большая часть времени работы архиватора приходится не на собственно упаковку, а на то, чтобы прочитать все эти файлы с диска – ускорение может достигать 30-50%! См. детали в разделе Использование памяти
| --crconly | Не записывать в архив упакованные данные, но вычислять и запоминать CRC архивируемых файлов. Эту опцию можно использовать для того, чтобы проверить позже – не изменились ли файлы
| --dirs | Добавить пустые каталоги в архив. Без указания этой опции, FreeArc добавляет пустые каталоги только в том случае, когда добавляются все файлы, т.е. явно или неявно указана маска “*”, и не использованы опции отбора файлов по различным критериям (-n/-ta/-tb/-tn/-to/-sl/-sm). Противоположна опции –ed (--nodirs)
| --groups | Имя файла, задающего порядок сортировки файлов для улучшения сжатия и описывающего типы файлов. По умолчанию это arc.groups из того каталога, где находится сама программа. Подробности о его формате смотрите в разделах Сортировка файлов для солид-сжатия Error! Bookmark not defined., Типы файлов.
| --logfile | Указать имя логфайла, куда будет записываться информация обо всех выполняемых операциях и сообщения об ошибках. Эту опцию удобно настроить в arc.ini или переменной среды FREEARC; пример: --logfile=c:\temp\freearc.log
| --noarcext | Если имя/маска архива указано без расширения, то к нему автоматически добавляется расширение .arc. Предотвратить это можно только одним способом – использовать опцию --noarcext J. Это относится и к именам архивов, объединяемых командой j. Эта опция в первую очередь предназначена для конфигурирования архиваторных оболочек, вы можете увидеть примеры её применения в настройках команд в плагинах к FAR и Total Commander.
| --nodata | Не записывать в архив упакованные данные, оставив только каталог архива. Эту опцию можно использовать для каталогизации файлов вместо их упаковки. Более того, можно превратить обычный архив в каталог файлов командой arc ch archive --nodata
| --nodir | Не записывать в архив каталог сархивированных файлов. Эта опция интересна только для тестирования архиваторов – чтобы слить множество мелких файлов в один большой в порядке, определяемом опцией -ds
| --original | Задаёт имя файла/URL оригинального архива в команде восстановления архива. Задаётся как: · --original без параметра – URL ищется в описании файла из files.bbs/descript.ion · --original? get – выполняется команда ОС get arcname и её вывод используется в качестве имени файла/URL оригинального архива · --original=name – имя файла/URL оригинального архива задаётся явно
| --print-config | Вывести определения методов сжатия. См. детали в разделе Конфиг-файл arc.ini
| --proxy | Задать proxy для загрузки файлов из Интернета вместо используемого по умолчанию. Если эта опция задана без параметра, то прокси по умолчанию отключается и все файлы загружаются напрямую
| --recompress | При обновлении архива перепаковывает все данные, используя текущие настройки сжатия. Эта опция может быть использована в тех случаях, когда для вас более важна степень сжатия архива, нежели время его обновления (см. Обновление солид-архивов)
| --save-bad-ranges | Сохраняет в указанном файле список сбойных частей архива, которые не удалось восстановить с помощью recovery record
| --sync | Синхронизация содержимого архива с набором архивируемых файлов. Одновременно обновляет устаревшие файлы в архиве, добавляет новые и удаляет исчезнувшие. При распаковке игнорируется. Эта опция предназначена главным образом для будущего использования с архивами, хранящими поколения файлов; впрочем, она также может быть использована для быстрого приведения архива в соответствии с содержимым диска без перепаковки уже сжатых файлов
| -- | Прекратить обработку опций. После “--“ далее в командной строке можно использовать любые имена файлов, в том числе и начинающиеся с символа “-“

## Задание опций

Большая часть опций – это просто булевские флаги, они задаются без всяких аргументов. Противоположное значение либо используется по умолчанию, либо может быть задано тем же именем с приставкой “no”, например --dirs и --nodirs. Значение по умолчанию для многих опций можно восстановить, используя в качестве параметра два минуса, например -z--; это может быть полезным, если нужно отменить значение опции, заданное в конфиг-файле arc.ini

Если опция принимает параметр, то его можно задать непосредственно или после знака “=”, например опции -dsen и -ds=en – эквивалентны. Предполагается, что использование “=” может способствовать повышению читаемости командной строки, особенно при использовании длинных имён опций. С этой же целью, кстати говоря, каждой опции выдан длинный вариант имени. Я рекомендую ориентироваться на длинные имена опций при создании batch-файлов, скриптов, настройке архиваторных оболочек и тому подобном.

Опции –s и –m имеют свой замысловатый формат, который описан в отдельных разделах: Настройка солид-сжатия Error! Bookmark not defined. и Настройка сжатия Error! Bookmark not defined..

В опциях, принимающих в качестве параметра размер в байтах, его можно задавать следующими способами:

· с суффиксом “b”, что означает байты: --cache65536b

· с суффиксом “k”, что означает килобайты: --cache256k

· с суффиксом “m”, что означает мегабайты: --cache10m

· с суффиксом “g”, что означает гигабайты: --cache1g

· с суффиксом “^”, что означает степень двойки: --cache23^ задаёт кеш в 2^23 байт, т.е. 8 мегабайт

#

# Подробности

## Запросы к пользователю

Из запросов к пользователю поддерживается только запрос о перезаписи существующего на диске файла – новым, извлекаемым из архива (см. описание опции –o). Он задаётся в виде “Overwrite <file> (y/n/a/u/s/q)?” и ответы на него толкуются следующим образом:

· “y” означает “Yes” – перезаписать файл

· “n” означает “No” – оставить уже существующий на диске файл

· “a” означает “Always” – перезаписать все файлы, не задавая больше запросов

· “u” означает “Update” – обновить файлы более свежими, не задавая больше запросов

· “s” означает “Skip” – пропустить все файлы, не задавая больше запросов

· “q” означает “Quit” – выйти из программы

· при неправильном ответе выводится подсказка

Опция –y задаёт ответ “да” на все запросы к пользователю (в будущем – не только о перезаписи), что создаёт возможность для автоматической работы программы без участия пользователя.

## Текстовые кодировки (charsets)

Внутри программы текстовые данные представляются в 32-битном Unicode. При чтении/записи на диск эти данные, как правило, должны быть представлены в иной кодировке. Опция -sc (--charset) позволяет менять часть кодировок, другие жёстко зашиты в программе. В следующей таблице перечислены кодировки, используемые программой по умолчанию в Windows и Unix, и способ их изменения:

| Windows default | Unix default | Способ изменения
Файл-листы | OEM | UTF-8 | -sclCHARSET
Файлы комментариев | OEM | UTF-8 | -sccCHARSET
arc.ini/arc.groups | OEM | UTF-8 | -sciCHARSET
Экранный в/в | OEM | UTF-8 |
Командная строка | ANSI | UTF-8 |
Имена файлов в FS | UTF-16 | UTF-8 |
Имена файлов внутри архива | UTF-8 | UTF-8 |

Где CHARSET может принимать одно из значений: OEM, ANSI, UTF-8 и UTF-16. Также поддерживается запись этой опции в виде, совместимом с RAR и 7-zip.

## Обработка ошибок

Сообщения о возникающих в процессе работы программы ошибках выводятся на stderr и дублируются в логфайл. Некоторые типы ошибок приводят к досрочному завершению программы – они классифицируются как fatal errors, другие позволяют продолжить работу – они классифицируются как warnings. В конце работы программа печатает кол-во warnings или “All OK” если ни ошибок, ни предупреждений не было. Код завершения программы:

· 0 – при отсутствии ошибок

· 1 – при наличии только предупреждений

· 2 – при фатальной ошибке

· 255 – при выходе по Ctrl-Break

Некоторые ошибки работы с файлами игнорируются: это относится к ошибкам удаления файлов при переносе в архив и ошибкам установки атрибутов при использовании опции –ac.

## Открытие файлов из Интернета

Различные файлы (архивы, файллисты, файлы комментариев, оригинал восстанавливаемого архива…) можно открывать напрямую из Интернета, указывая вместо имени файла его URL. Попробуйте, например, команды:

arc l http://www.haskell.org/bz/arc.arc

arc x http://www.haskell.org/bz/arc.arc *.h

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

При работе с архивами из интернета выкачиваются только те данные, которые необходимы для выполнения операции; таким образом, вы можете легко работать с огромными архивами, которые нецелесообразно загружать целиком! Имейте в виду, что сервера без возможности докачки не поддерживаются вообще!

В Windows эта возможность реализована через библиотеку Wininet.dll, поэтому она использует настройки прокси, сконфигурированные в Internet Explorer. Альтернативно, вы можете задать proxy и bypass list опциями --proxy/--bypass. Детали их настройки описаны в http://msdn2.microsoft.com/en-US/library/aa383996.aspx , вместо пробелов можно использовать запятые. Имейте в виду, что ввиду особенностей этой библиотеки доступ в Интернет не будет работать, если в Internet Explorer включена Автономная работа. Кроме того, использование этой библиотеки значительно уменьшает объём памяти, доступный программе, поэтому у вас могут возникнуть проблемы с одновременным использованием файлов из Интернета и сжатия в режимах -m7..-m9, -mx, -max, как и распаковки архивов, созданных в этих режимах. В этом случае или используйте более слабый режим сжатия, или предварительно выкачайте все необходимые файлы из Интернета.

В Unix используется библиотека libcurl. Прокси настраиваются переменными среды http_proxy, ftp_proxy, all_proxy и no_proxy, подробности читайте в man curl. Опция --proxy также поддерживается.

## Шифрование данных

Если данные в архиве зашифрованы, то их невозможно извлечь без знания пароля. Если зашифрована ещё и служебная информация архива, то о содержащихся в архиве файлах невозможно вообще ничего узнать – даже их имена! Шифрование контролируется следующими опциями:

· Опция –p[PASSWORD] включает шифрование сжимаемых данных и опционально задаёт пароль, используемый для шифрования

· Опция –hp[PASSWORD] включает шифрование И данных, И служебной информации, и опционально задаёт пароль

· Опция –kf=FILE определяет keyfile (файл-ключ), используемый в качестве дополнительного пароля

· Опция –opPASSWORD позволяет задать дополнительные пароли, используемые только для дешифрования

· Опция –okf=FILE позволяет задать дополнительные keyfiles, используемые только для дешифрования

· Опция –ae=… задаёт алгоритм или последовательность алгоритмов, используемых для шифрования

При задании опции –hp (с параметром или без) будут шифроваться И данные, И заголовки. Если задана только опция –p, то будут шифроваться только данные. Это делает более удобным просмотр архива, но имейте в виду – значительно снижает уровень защиты, поскольку при этом всем будут доступны данные об именах файлов, их размерах и CRC. Если опцией –kf задан файл-ключ, то его содержимое будет добавлено к любому используемому паролю – это позволяет значительно увеличить надёжность шифрования, предотвращая любые попытки взлома архива путём перебора по словарю.

Если пароль не указан ни в опции –p, ни в –hp, и не используется файл-ключ, то пароль будет запрошен у пользователя в режиме невидимого ввода. При архивации данных пароль нужно ввести дважды, при распаковке – только один раз. Также пароль будет запрошен при использовании «вопросительной» версии опции: –p? или –hp?. Если же указана «отрицательная» версия опции – –p– или –hp–, то пароль наоборот никогда не будет запрашиваться и если какие-то данные зашифрованы, то программа просто выведет сообщение, что их невозможно распаковать. Это полезно для применения программы в batch-mode – чтобы быть уверенным, что программа не зависнет в бесконечном ожидании ввода пароля.

Вы также можете задать старые пароли опцией –op и старые keyfiles опцией –okf. В отличие от паролей/keyfiles, заданных в опциях –p/ –hp/–kf, эти никогда не будут использоваться для шифрования данных – только для расшифровки. При расшифровке программа проверяет все пароли, указанные в опциях –p/–hp/–op и введённые с клавиатуры, в сочетании со всеми keyfiles, указанными в опциях –kf/–okf и по отдельности (пароли без keyfiles, keyfiles без паролей), и только когда ни одно из этих сочетаний не позволяет расшифровать данные – запрашивается другой пароль.

Используя команду модификации архива с опциями –op и/или –p, вы можете зашифровать, расшифровать или перешифровать архив:

arc ch archive -p[PWD] [-hp] [-kf..] [-ae=..] --recompress

arc ch archive -op[PWD] [-okf..] --recompress

arc ch archive -op[OLDPWD] -p[NEWPWD] … --recompress

Опция –ae выбирает алгоритм шифрования: aes, blowfish, serpent или twofish, к которому можно добавить размер ключа в битах и потоковый режим (ctr или cfb), например: –ae=blowfish-448/ctr. Размер ключа может меняться в следующих пределах: aes, serpent, twofish: 128, 192, 256; blowfish: 64..448. По умолчанию используется ключ самой большой допустимой для данного алгоритма длины и режим CTR. Кроме того, можно установить кол-во раундов шифрования через параметр :r и кол-во итераций при вычислении ключа шифрования через :n. Пример: –ae=aes-128: r20: n2000. Наконец, можно задать последовательное применение нескольких алгоритмов шифрования, при этом выход первого алгоритма зашифровывается вторым и т.д., и наконец выход последнего алгоритма записывается в архив, например: –ae=aes-128+serpent: n5000+twofish/cfb. Значение опции –ae по умолчанию - AES со стандартными настройками. Разумеется, использованные для каждого блока алгоритмы шифрования со всеми их настройками сохраняются в архиве, так что эта опция определяет только способ шифрования новых блоков.

Технические детали: с каждым зашифрованным блоком сохраняется salt с размером, равным размеру ключа шифрования, и IV с размером, равным размеру блока шифрования (64 бита для blowfish, и 128 бит для aes, serpent, twofish). Ключ шифрования вычисляется исходя из пароля/ключевого файла, смешанного с salt, алгоритмом PKCS#5.2/SHA-512, его кол-во итераций задаётся параметром :n, и по умолчанию равно 1000. Если блок шифруется несколькими алгоритмами последовательно (типа –ae=aes-128+serpent+twofish), то естественно для каждого из них создаются свои salt и IV. Для генерации salt/IV используется криптографический генератор случайных чисел FORTUNA-SHA512/AES, инициализируемый из /dev/urandom в Unix, и состоянием системы в Windows.

Замечу, что вы можете спокойно указывать опции –kf, –ae в конфиг-файле. Их присутствие само по себе не включает шифрования – оно включается только опциями –p и –hp. Разумеется, здесь же вы можете разместить и опции –op/–okf, описывающие все возможные пароли и keyfiles, которыми могут быть зашифрованы распаковываемые вами данные.

Для генерации keyfile вы можете использовать следующий метод: возьмите произвольный файл srcfile размером 1-2 кб и зашифруйте его командой arc a keyfile. srcfile -p1 --nodir

## Защита и восстановление данных

FreeArc обеспечивает возможности защиты и восстановления данных, сходные с доступными в RAR и других архиваторах: в архив можно включить дополнительный блок данных, называемый recovery record, формируемый с помощью операций XOR из секторов архива. Этот блок данных позволяет проверять целостность архива перед любыми операциями с ним, и восстанавливать содержимое архива при обнаружении сбоев. На практике он успешно справляется с искажениями данных из-за сбоев в магнитных носителях. Использование средств защиты и восстановления данных разбивается на три этапа:

· Вы используете опцию –rr для добавления recovery record в процессе архивации или команду rr для добавления recovery record к уже существующему архиву

· При наличии в архиве recovery record, перед любой операцией с архивом его содержимое автоматически проверяется с её использованием. При обнаружении сбоев дальнейшие действия не производятся, однако архив не восстанавливается автоматически. Эта предпроверка управляется опцией –tp и при соответствующей настройке может производиться даже при отсутствии в архиве recovery record – путём полного тестирования архива. Опция –t задаёт полное тестирование архива после его обновления. Максимальное кол-во всевозможных проверок можно организовать сочетанием опций –tp3 –rr –t J

· Если программа обнаружила сбой в архиве, то она посоветует вам использовать команду r для его восстановления. Эта команда использует recovery record для восстановления содержимого архива и записывает восстановленный архив в файл fixed.<arcname>. Восстановленный архив содержит recovery record, скопированную из исходного архива

· Если команда восстановления не смогла восстановить архив до конца или вы по каким-либо причинам не хотите ею пользоваться, то вам придётся отключить тестирование recovery record опцией –tp–

Следует также заметить, что если сбой «накроет» центральный каталог архива и его не удастся полностью восстановить, то это будет означать потерю всех данных в архиве! К сожалению, разбиение центрального каталога на небольшие части (например, опцией –s8m;) не решит проблему полностью, поскольку в программе пока отсутствует возможность поиска «потерянных» частей оглавления архива при его восстановлении. Поэтому на данный момент надёжность защиты данных уступает по своему уровню RAR’овской. Это планируется исправить в следующих версиях программы.

Команда восстановления архива r может также использовать оригинал архива (как правило, находящийся в Интернете) для загрузки из него тех частей файла, которые невозможно восстановить по recovery record (FreeArc в таких случаях пишет “NNN unrecoverable errors”). Для этого нужно задать URL (или имя файла) надёжной копии опцией --original:

arc r bad --original=http://www.haskell.org/bz/good.arc

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

Опция --original имеет ещё две формы, удобные для использования в настройках по умолчанию:

· --original без параметра находит строчку описания восстанавливаемого архива в files.bbs или descript.ion, и извлекает из неё URL оригинала. Многие download-программы способны записывать туда URL оригинала, что делает эту опцию очень удобной

· --original? geturl выполняет команду geturl arcname и использует её вывод в качестве URL оригинального архива. Её можно использовать в тех случаях, когда возможно автоматически найти адрес оригинала, но это требует иного алгоритма, нежели заложенный в --original по умолчанию

Вместо --original, в команде восстановления архива можно использовать опцию --save-bad-ranges=FILENAME. Она записывает в заданный файл список частей архива, которые нужно выкачать заново. Вы можете использовать этот список для выкачки данных утилитой вроде curl и затем пропатчить ими архив.

Для восстановления архива через Интернет достаточно наличия в нём recovery record любого объёма, хотя бы самого малого, поскольку при этом используются только сохранённые в ней CRC секторов архива. Поэтому, специально для восстановления через Интернет, FreeArc поддерживает опцию –rr0% (или –rr0, а также команды rr0% и rr0), которая добавляет в архив минимальную recovery record, описывающую только CRC секторов архива. Её размер составляет всего 0.1% от размера архива. Этого недостаточно для самовосстановления архива, но вполне достаточно для восстановления через Интернет. Рекомендую все выкладываемые в Интернет архивы снабжать как минимум такой recovery record. Вы можете ещё сильнее её уменьшить, указав размер recovery сектора явно – например, –rr0*64kb.

Технические детали

recovery record записывается в архив следующим образом:

1. После выбора размера recovery сектора (может быть 512/1k/2k/4k/... байт) весь архив разбивается на сектора этого размера. Для каждого из них подсчитывается CRC32, затем сохраняемая в recovery record.

2. Одновременно с этим создаётся N recovery секторов, и каждый сектор архива (с номером i) отображается на (i `mod` N)-ый сектор recovery. Все сектора архива, отображённые на один recovery сектор, xor'ятся между собой, и в recovery record записывается результирующий сектор. Таким образом, recovery record включает в себя N recovery секторов, каждый из которых содержит "обобщённую" информацию о соответствующих ему секторах архива.

Проверка целостности архива сводится к подсчёту CRC секторов архива. CRC, отличное от оригинального (сохранённого в recovery record), означает, что этот сектор содержит сбои.

Восстановление архива возможно, если на один recovery сектор приходится не более одного сбойного сектора архива. В этом случае правильное содержимое сбойного сектора вычисляется xor'еньем содержимого recovery сектора и всех остальных секторов архива, соответствующих этому recovery сектору.

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

## Отличия от RAR

Хотя FreeArc ориентирован на максимальную совместимость с RAR в плане одинакового поведения команд и опций с теми же именами, между ними всё же есть крошечные различия:

· –md64 означает словарь 64 мб

· различные форматы аргумента команды –ag; заметьте, что при использовании –ag без параметра обе программы работают одинаково

· опция –rr «залипает» - её аргумент записывается внутрь архива и задействуется при всех последующих командах обновления архива вплоть до тех пор, пока новое значение –rr не будет явно задано в командной строке; поэтому для отключения последующих добавлений recovery record к архиву нужно использовать опцию –rr–

· команда r не сканирует архив в поисках восстановимых каталогов – она восстанавливает только то, что можно восстановить с помощью recovery record

· –zFILENAME работает также при распаковке, извлекая комментарий архива в заданный файл

· маска makefile.* не включает файл без расширения makefile

· команда a –df эквивалентна команде mf, а a –d эквивалентно команде m, в отличие от RAR, где a –df эквивалентно команде m

· при использовании опций отбора файлов -n/-sl/-sm/-ta/-tb/-tn/-to пустые каталоги не добавляются в архив (например, в команде arc a archive -r -sm10kb)

## Технические ограничения

Размеры обрабатываемых файлов и самого архива ограничены 2^63 байт, а кол-во файлов в архиве – 2 миллиардами. Оба эти ограничения не являются принципиальными и будут увеличены, как только возникнет необходимость.

На практике кол-во файлов в архиве ограничивается только кол-вом доступной программе физической памяти. Информация об одном файле занимает в памяти порядка 500 байт. Если учесть, что память также требуется для алгоритмов упаковки и распаковки, операционной системы, программ и т.д., то мы увидим, что на машине с 2 Гб памяти можно полноценно работать с архивами, содержащими до 3 миллионов файлов.

При распаковке из архива лишь части файлов кол-во используемой памяти пропорционально количеству распаковываемых файлов. Таким образом, вы можете распаковывать архивы, содержащие хоть миллионы файлов, по частям, имея машину всего с 32 Мб ОЗУ.

Если между упаковкой и распаковкой файла произошёл изменение сдвига времени относительно UTC (как бывает в регионах с daylight saving time, если упаковка происходит летом, а распаковка зимой или наоборот), то время распакованного файла может на час отличаться от того, которое имел оригинал. Насколько я понимаю, это общая проблема для Windows-программ.

#

# Настройка солид-сжатия

Как известно, для улучшения сжатия небольших файлов их следует объединять в общие блоки, которые сжимаются как один большой файл. Этим процессом управляет опция –s. Примеры её задания:

-s16m | Создавать блоки размером в 16 мб. Правила задания размеров смотрите в разделе Задание опций
-s100 | Создавать блоки, содержащие по 100 файлов
-se | Создавать отдельный блок для каждого расширения имени файлов
-s | Слить все файлы в один блок
-s- | Отключить солид-сжатие, т.е. создавать отдельный блок для каждого файла

По умолчанию используется опция –s1gb. Возможно также применение двух или трёх критериев одновременно, например -se10m100f будет создавать блоки, содержащие файлы с одинаковым расширением, но не более 10 мб и не более 100 файлов в одном блоке. Кстати, обратите внимание, что «размер солид-блока до 10 мб» трактуется программой как «суммарный размер файлов в солид-блоке, за исключением последнего, не должен превышать 10 мб» или иными словами «обеспечить, чтобы кол-во лишних данных, распаковываемых при извлечении одного-единственного файла, не превышало 10 мб».

При использовании блочных алгоритмов, размер создаваемых солид-блоков будет ограничен размером блока данных в используемом алгоритме (делать солид-блоки больших размеров всё равно не имеет смысла, а вот распаковку одиночных файлов это ускоряет).

При использовании алгоритмов сжатия tta, jpg, mm+…, файлы сжимаемые этими алгоритмами, не объединяются в солид-блоки. Это связано с особенностями этих алгоритмов, и иногда может ухудшить сжатие, например когда архив включает несколько копий одного и того же jpg-файла.

Для увеличения надёжности и поддержки создания архивов неограниченного объёма FreeArc также поддерживает разбивку каталога архива на отдельные блоки, записываемые в архиве непосредственно после описываемых ими файлов. По умолчанию каталог архива разбивается на блоки, описывающие по 20 тысяч файлов. Эту настройку можно изменить, записав её в опции -s перед “;”. Например, опция -s100;1m задаёт разбиение каталога архива на блоки, описывающие по 100 файлов, а внутри каждого из них – группировку файлов для солид-сжатия в блоки по 1 мб. Таким образом, эту настройку возможно изменить только одновременно с настройкой солид-сжатия. Если в опции -s не встречается “;”, то размер блока каталога устанавливается стандартный – по 20 000 файлов. Вот ещё несколько примеров:

-s100; | Блоки каталога по 100 файлов. Солид-блоки на все файлы в каждом блоке каталога
-s; | Один каталог и один солид-блок на весь архив
-s;100 | Один каталог на весь архив, солид-блоки по 100 файлов
-s | Каталоги по 20 000 файлов, солид-блоки на все файлы внутри каждого блока каталога (вышеприведённое описание этой же опции “Слить все файлы в один блок” чуть-чуть неточно J)

Таким образом, используемая по умолчанию опция -s1gb эквивалентна -s20000;1gb

Эту опцию можно также задать в виде эмуляции структуры каталога существующих программ:

-s=7z | Эквивалентно “-s;”
-s=cab | Также эквивалентно “-s;”, но при этом отключает сжатие каталога архива, как это делает cabarc
-s=zip | Эквивалентно “-s;1”, т.е. каждый файл сжимается независимо от других, а блок каталога создаётся один общий на весь архив
-s=arj | Эквивалентно “-s1;1”, т.е. каждый файл сжимается независимо от других и тут же после него записывается блок каталога, описывающий этот файл

## Сортировка файлов для солид-сжатия

Для повышения степени упаковки файлы при солид-сжатии следует отсортировать так, чтобы файлы с похожим содержимым оказались близко друг к другу. Для этого служит опция –ds, задающая порядок сортировки, например –dsgen. Буквы, задаваемые после –ds, расшифровываются как:

c | Разбить уже сформированную группу на две части – файлы до 128 кб сортировать в соответствии с последующими заданными пользователем критериями, а файлы больше 128 кб – по размеру
e | Сортировка по расширению
g | Сортировка по группам, описанным в файле arc.groups
i | Сгруппировать файлы по первым трём буквам имени, внутри групп отсортировать по оставшимся критериям, файлы не вошедшие ни в одну из групп, собрать вместе и отсортировать по размеру
n | Сортировка по имени файла внутри каталога
p | Сортировка по имени каталога
r | Переупорядочение внутри уже сформированной группы, располагающее рядом близкие по размеру и имени файлы. Это даёт возможность сделать ближе, к примеру, последовательные версии одного и того же файла
s | Сортировка по размеру
t | Сортировка по дате/времени файла

К примеру, –dsgen означает сортировку сначала по группе из arc.groups (буква ‘g’), затем внутри каждой из этих групп – по расширению (буква ‘e’), и внутри расширений по базовым именам файлов (буква ‘n’). Этот порядок сортировки, обеспечивающий весьма приличные результаты, применяется в RAR и последних версиях 7-zip. В FreeArc по умолчанию используется –dsgerpn, что ещё круче J: во-первых, файлы группируются по каталогам и уже внутри каталогов сортируются по именам (буквы “pn”); во-вторых, похожие файлы располагаются рядом (буква ‘r’).

Однако альтернативные порядки сортировки, такие как –dsgercpn, –dsgepn, –dsgeipn, –dsgenp и –dsges, в отдельных случаях могут увеличить сжатие. Если вы хотите вообще отключить сортировку (что ускорит упаковку множества небольших файлов, но ухудшит сжатие), используйте опцию –ds без параметра. Сортировка по умолчанию автоматически выключается при отключении солид-сжатия (–s–), отключении упаковки (–m0), при использовании самого быстрого алгоритма сжатия (–m1) или fake-сжатия (--nodata или --crconly); если вы хотите, чтобы файлы были отсортированы в этих режимах, задайте опцию –dsgerpn (или какой порядок вам нужен) явно.

По умолчанию список групп берётся из файла arc.groups, который должен находиться в том же каталоге, что и Arc.exe (под Windows) или в каталоге /etc (в Unix). Опция --groups позволяет задать другой файл групп. Порядок, в котором в нём описаны маски файлов, определяет тот порядок, в котором эти файлы будут помещены в архив. Метка $default указывает место для всех оставшихся файлов. Формат arc.groups полностью совместим с форматом rarfiles.lst, т.е. вы можете использовать для обеих программ общий файл групп. Но при этом для того, чтобы работал автоматический выбор алгоритма упаковки, мультимедиа-сжатие и опция –ms, в файл групп нужно добавить описания типов файлов (см. раздел Типы файлов).

## Обновление солид-архивов

Большинство архиваторов предоставляет лишь ограниченные возможности по обновлению солид-архивов. В отличие от них, FreeArc способен обновлять любые солид-архивы, осуществляя распаковку старых данных и упаковку заново в параллельных тредах.

При обновлении солид-архивов FreeArc вставляет новые файлы между старых в соответствии с используемым порядком сортировки. Например, если в архиве уже есть файлы arc.hs и decompress.hs, то файл compress.hs будет вставлен между ними (при стандартной сортировке). При этом FreeArc переупаковывает только те солид-блоки, в которых есть изменившиеся, добавленные или удалённые файлы. Более того, он позволяет блокам «гулять» в пределах ±50% от заданных размеров ради того, чтобы не перепаковывать весь архив при каждом изменении. К примеру, если архив создан с 8мб блоками и в один из них добавляется 1 мб файл, то этот блок станет содержать 9 мб, но зато остальные блоки не придётся перепаковывать. Аналогично, после удаления 1 мб файла в блоке останется всего 7 мб. Когда размер блока превысит 12 мб – он будет разбит на два блока. Если же размер блока станет меньше 4 мб, то данные из этого и следующего блока будут перераспределены между ними. Таким образом, небольшие изменения в архив вносятся за считанные секунды при сохранении всех преимуществ солид-сжатия.

Если вы хотите при добавлении новых файлов в архив полностью исключить переупаковку уже существующих в нём данных, то используйте опцию --append. Однако имейте в виду, что при использовании большого количества команд добавления с запретом переупаковки вы можете создать архив, содержащий множество небольших солид-блоков. С другой стороны, вы можете использовать опцию --recompress для полной переупаковки данных в архиве в соответствии с текущими настройками сжатия – при этом будут переупакованы даже те солид-блоки, содержимое которых совершенно не изменилось. Однако в большинстве случаев лучше положиться на интеллект программы и не использовать этих опций. В любом случае, вы можете перепаковать содержимое архива командой ch, например:

arc ch archive –m5

#

# Настройка сжатия

Опция –m, задающая метод сжатия, имеет множество возможностей. Мы рассмотрим их от простого к сложному. Самый простой способ выбрать метод сжатия – опции –m1…–m9. Степень сжатия возрастает от –m1 к –m9, одновременно с этим, разумеется, увеличивается и время работы, и использование памяти. Для –m3 достаточно машины с 64 Мб ОЗУ, для –m4 – 128 Мб и т.д. Вы можете использовать опцию –mx, чтобы программа автоматически выбрала из них наиболее мощный режим, который влезет в вашу память. Имейте в виду, что при этом для распаковки вам потребуется иметь столько же ОЗУ.

Существует также «параллельная» линия методов сжатия – от –m1x до –m9x. Эти методы требуют ровно столько же памяти для упаковки – 64 Мб для –m3x и т.д., но отличаются быстрой и требующей мало памяти распаковкой. Расплатой за это является небольшое ухудшение степени сжатия и скорости упаковки.

Наконец, методы сжатия –m5p..–m9p являются «усиленными» версиями методов –m5..–m9, использующими дополнительные внешние упаковщики и фильтры - ppmonstr для текстов, precomp для упакованных данных (zip, pdf, jpg, gif…). Поэтому они дают ещё большую степень сжатия, но работают медленней и требуют при распаковке наличия всех внешних программ, которые были использованы при упаковке. Вы можете использовать опцию –max, чтобы программа автоматически выбрала из них наиболее мощный режим, который влезет в вашу память.

Кроме этого, есть несколько «маргинальных» опций сжатия: –m5q..–m9q используют ppmonstr.exe для сжатия не только текстовых, но и бинарных файлов, что не всегда увеличивает степень сжатия (по сравнению с –m5p..–m9p), но всегда замедляет упаковку. –m2r/–m3r/–m4r/–m5r – небольшие «вариации на тему» методов –m2..–m5. Вы можете добавить свои собственные методы сжатия, изменить существующие, описать сокращённые названия (профайлы), редактируя файл arc.ini.

Следующая таблица демонстрирует характеристики основных методов сжатия, усреднённые по большому объёму протестированных данных (тесты проводились на компьютере с процессором 1.2 ГГц и 512 Мб памяти):

| Степень сжатия | Скорость упаковки, kb/sec | Скорость распаковки, kb/sec | Память для упаковки | Память для распаковки
-m1 | 3.123 | 8.086 | 20.474 | 16 mb | 16 mb
-m2 | 4.477 | 4.199 | 8.015 | 32 mb | 32 mb
-m3 | 5.119 | 1.497 | 4.213 | 64 mb | 64 mb
-m4 | 5.553 | 697 | 3.983 | 128 mb | 128 mb
-m5 | 5.700 | 522 | 3.674 | 256 mb | 256 mb
-m5p | 5.903 | 359 | 1.171 | 256 mb | 256 mb
Режимы с быстрой распаковкой
-m1x | 3.123 | 8.086 | 20.474 | 16 mb | 16 mb
-m2x | 4.263 | 4.947 | 19.044 | 32 mb | 16 mb
-m3x | 4.811 | 1.684 | 10.762 | 64 mb | 4 mb
-m4x | 5.443 | 621 | 11.271 | 128 mb | 8 mb
-m5x | 5.657 | 458 | 11.451 | 256 mb | 16 mb

В следующей таблице приведены результаты работы других архиваторов на том же наборе данных:

| Степень сжатия | Скорость упаковки, kb/sec | Скорость распаковки, kb/sec | Память для упаковки | Память для распаковки
SBC 0.970 -of
-m1 -b5 | 3.947 | 1.324 | 2.801 | 18 mb | 18 mb
-m2 -b15 | 4.339 | 908 | 2.536 | 50 mb | 50 mb
-m3 -b63 | 4.799 | 473 | 1.960 | 224 mb | 224 mb
RAR 3.70 (-md4096 -s)
-m1 | 3.361 | 3.824 | 19.737 | 32 mb | 4 mb
-m2 | 4.312 | 1.198 | 22.986 | 32 mb | 4 mb
-m3 | 4.574 | 899 | 22.344 | 32 mb | 4 mb
-m5 | 4.734 | 701 | 3.765 | 64 mb | 32 mb
-m5 -mc14:128t | 4.794 | 665 | 2.994 | 160 mb | 128 mb
7-zip 4.52
-mx1 | 3.773 | 2.053 | 11.710 | 280 kb | 64 kb
-mx3 | 4.368 | 1.745 | 13.268 | 16 mb | 1 mb
-mx5 | 5.403 | 506 | 15.139 | 256 mb | 16 mb
-mx7 | 5.481 | 412 | 15.008 | 512 mb | 32 mb
-mx9 -md=32m | 5.564 | 423 | 14.280 | 512 mb | 32 mb
UHARC 0.6b (-md32768)
-mz | 4.562 | 2.149 | 1.988 | 32 mb | 32 mb
-m1 | 5.298 | 397 | 3.138 | 512 mb | 32 mb
-m3 | 5.477 | 252 | 3.247 | 512 mb | 32 mb
-mx | 5.773 | 260 | 303 | 64 mb | 64 mb
Прочие
Squeez 5.2 | 5.315 | 356 | 3.083 | 512 mb | 128 mb
Durilca’light | 5.038 | 669 | 677 | 512 mb | 512 mb
Durilca’light –t1 | 5.415 | 183 | 913 | 512 mb | 512 mb
CCM 1.25 | 5.793 | 402 |  | 512 mb | 512 mb
CCMx 1.25 | 5.856 | 313 |  | 512 mb | 512 mb
LPAQ5 | 6.128 | 95 |  | 512 mb | 512 mb
Durilca –t1 | 6.302 | 48 |  | 512 mb | 512 mb
UDA 0.301 | 6.828 | 20 |  | 256 mb | 256 mb

Как видите, большинство архиваторов предоставляют довольно ограниченные возможности по регулированию степени сжатия / скорости работы. Следующая таблица сопоставляет режимы сжатия FreeArc c близкими по скорости/сжатию режимами других архиваторов:

FreeArc | PKZIP | ZIP | RAR | 7-zip | UHARC
-m1 | -es | -1 |  |  |
-m2 | -ex | -9 | -m1 | -mx1 | -mz
-m3 |  |  | -m5 | -mx5 | -m1
-m4 |  |  |  | -mx9 | -m3
-m5 |  |  |  |  | -mx

## Типы файлов

В каждом режиме сжатия (–m1…–m9x) используемые алгоритмы сжатия выбираются в зависимости от типа файла – для текстовых файлов применяются одни алгоритмы, для бинарных – другие, для мультимедийных - третьи. Тип файла определяется по его расширению. С этой целью формат файла arc.groups, описывающего порядок сортировки файлов, был несколько расширен и теперь включает в себя также описания типов файлов в виде меток $text, $binary и т.д., вставляемых перед файлами соответствующего типа:

$text

readme.*

*.txt

*.doc

$binary

*.pdf

$default

$compressed

*.7z

*.arc

*.rar

*.zip

$wav

*.wav

Это описание означает, что файлы readme.*, *.txt и *.doc являются текстовыми, 7z/arc/rar/zip – упакованными и т.д. Метка $default, как и в RAR, описывает «прочие» файлы, не удовлетворяющие ни одной из явно указанных масок. В данном примере прочие файлы попадают в группу $binary. Итак, в этом примере все файлы разбиты на 4 группы - $text, $binary, $compressed и $wav.

Для того чтобы добиться максимального сжатия ваших собственных данных, следите за тем, чтобы все типичные для ваших данных расширения текстовых, звуковых, графических и уже упакованных файлов были включены в секции $text, $wav, $bmp и $compressed, соответственно. Файлы с неизвестными расширениями попадают в секцию $binary, поэтому для бинарных файлов включение их расширений в этот файл не так критично (но не забудьте, что arc.groups описывает ещё и порядок сортировки). Не забудьте использовать опцию –ms, если вам необходимо действительно отключить сжатие файлов из группы $compressed.

## Мультимедиа-сжатие

FreeArc реализует мультимедийное сжатие, что сводится к применению специальных алгоритмов сжатия к файлам, включённым в группы $wav и $bmp. В первую из них следует включать лишь чисто звуковые, неупакованные файлы (sound wave files); файлы, содержащие смешанные данные (например *.stm), не будут хорошо сжиматься этим алгоритмом, равно как и файлы, в которых уже применено сжатие какого-либо типа. Вторая группа предназначена для неупакованных графических файлов (bitmap graphics).

В режимах сжатия –m1…–m9x мультимедиа-сжатие включается автоматически, при тонкой настройке сжатия может понадобиться включать его вручную (см. Расшифровка алгоритма сжатия и Секция [Compression methods]).

Ручное управление мультимедиа-сжатием реализуется опцией –mm:

· –mm– – отключить мультимедиа-сжатие. Отключает использование специальных методов сжатия для файлов типа $bmp и $wav. Аналогично последовательности опций –m$bmp= –m$wav=

· –mmfast – включить быстрое мультимедиа-сжатие. Аналогично последовательности опций –m$bmp=bmpfast –m$wav=wavfast

· –mm=max – включить плотное мультимедиа-сжатие. Аналогично последовательности опций –m$bmp=bmp –m$wav=wav

· –mm+ (или просто –mm) – включить мультимедиа-сжатие с автоматическим выбором используемых алгоритмов (выбор между быстрым и плотным ММ-сжатием определяется тем, насколько быстрым является основной алгоритм сжатия)

· (по умолчанию) – использование и тип мультимедиа-сжатия определяется настройками используемого метода сжатия

Опция –mc позволяет отключить отдельные алгоритмы сжатия. Например, -mc-rep отключает препроцессор REP, а –mc-delta – дельта-фильтр. При этом упоминания соответствующих алгоритмов сжатия просто удаляются из цепочек алгоритмов сжатия. Если вы удаляете последний (основной) алгоритм в цепочке, то эта группа сжатия удаляется целиком, например опция –m-ppmd в режимах –m3..-m9 приведёт к удалению группы $text. Можно задать и удаление группы: -mc-$text, что эквивалентно опции –m$text=. Кроме того, поддерживаются совместимые с RAR однобуквенные сокращения:

RAR-style опция | Эквивалент | Описание
-mca- | -mc-$wav | Отключить специальное сжатие для аудиоданных
-mcc- | -mc-$bmp | Отключить специальное сжатие для графики
-mcd- | -mc-delta | Отключить дельта-фильтр (препроцессор табличных структур)
-mce- | -mc-exe | Отключить препроцессинг исполняемых файлов
-mcl- | -mc-lzp | Отключить LZP (препроцессор повторов для текстов)
-mcr- | -mc-rep | Отключить расширенный до 1 гб словарь
-mct- | -mc-$text | Отключить специальное сжатие для текстов
-mcz- | -mc-dict | Отключить DICT (словарная замена для текстов)

## Использование памяти

Если 75% от общего объёма физической памяти недостаточно для выбранного алгоритма сжатия, то программа автоматически уменьшает размер словаря/блока/... так, чтобы уместиться в этот объём памяти. Это ограничение можно снять с помощью опции –lc– или установить своё собственное, например –lc128mb. Также можно установить ограничение на объём памяти, который потребуется для распаковки создаваемого архива, с помощью опции –ld. Размер памяти можно задать и в процентах от общего объёма ОЗУ, например –lc25% (настройки по умолчанию: –lc75% –ld75%; вместо % можно использовать букву p, например –lc25p). При распаковке опция –ld также управляет объёмом используемой памяти, но возможности этого управления невелики – она может использовать только сохранение промежуточных данных в файлах на диске, если алгоритм позволяет это.

Опция –md устанавливает размер блока (для блочных алгоритмов) или словаря (для LZMA).

Если общий объём упаковываемых в один солид-блок данных меньше размера блока/словаря, то размер блока/словаря для этого солид-блока соответствующим образом уменьшается. Поэтому реальное потребление памяти может оказаться меньше выведенного на экран. Алгоритмы сжатия, реально используемые в каждом создаваемом солид-блоке, и их требования к памяти можно вывести на экран опцией –di+$.

Программа использует буфер упреждающего чтения для ускорения сжатия небольших файлов. По умолчанию программа пытается выделить для него 16 mb или размер блока данных при использовании блочных алгоритмов – смотря что больше. При необходимости этот размер автоматически уменьшается так, чтобы вместе с памятью, необходимой для алгоритма упаковки, он не превышал 50% от объёма ОЗУ компьютера – вплоть до использования всего 1 мб. Вы можете сами установить размер этого буфера, например --cache=100mb или --cache=40%. Опция --cache- устанавливает минимально возможный размер кэша (равный 64 кб).

FreeArc старается использовать ресурсы компьютера по максимуму. Рассмотрим, например, работу на разных машинах метода –m5, использующего суммарно 384 мб памяти. На машине всего с 256 мб ОЗУ алгоритм будет разбит на две части, использующие по 192 мб, и эти части будут выполнены последовательно, а данные между ними переданы через промежуточный файл. На машине с 512 мб ОЗУ обе части алгоритма будут выполняться параллельно, а данные между ними передаваться через память. Наконец, на машине с 1Гб ОЗУ помимо этого будет выделено 64 мб для буфера упреждающего чтения. Таким образом, результаты сжатия на всех машинах будут одинаковы, но чем больше памяти доступно, тем быстрее всё будет кончено J.

## Максимальное сжатие

Если вы хотите добиться максимальной степени сжатия без возни с тонкой настройкой, то используйте одну из следующих опций:

· –max – включает самое-самое мощное сжатие, доступное при вашем объёме памяти. Для распаковки вам потребуется такой же объём памяти плюс те же версии внешних компрессоров, которые были доступны при упаковке

· –mx – самое мощное сжатие, доступное при вашем объёме памяти, но без использования внешних компрессоров. Для распаковки вам потребуется такой же объём памяти, как и при упаковке

· –m9x – самое мощное асимметричное сжатие, доступное при вашем объёме памяти. При распаковке будет использоваться в 8 раз меньше памяти, и она будет идти гораздо быстрее, чем упаковка. Этот режим сжатия удобен для создания дистрибутивов и т.п.

Если вам нужно дополнительно ограничить объём памяти, используемой для упаковки или распаковки, то добавьте опции –lc/–ld. Например: –mx –lc1gb –ld256mb задаёт максимальное внутреннее сжатие, ограниченное 1 гб памяти при упаковке и 256 мб при распаковке.

#

# Детальное управление сжатием

## Расшифровка алгоритма сжатия

Метод сжатия, заданный в опции –m, проходит через серию подстановок. Рассмотрим результат их работы на примере режима сжатия, используемого по умолчанию: –m4. Первым делом –m4 преобразуется в –m4b/4t. Эта запись означает «использовать для текстовых файлов (группы $text) режим сжатия –m4t, а для всех прочих –m4b». Вы можете сами задать подобные режимы, например:

· опция –m4b означает «аналогично -m4, но рассматривать все файлы как бинарные»

· опция –m4b/3t означает «использовать для бинарных файлов сжатие -m4b, а для текстовых –m3t», т.е. сжимать бинарные файлы на уровне –m4, а текстовые – на уровне –m3

Все простые записи методов сжатия (-m1..-m9x) преобразуются подобным образом, например –m9x превращается в –m9xb/9xt.

Затем к этой записи добавляются специфичные методы сжатия для отдельных типов файлов. Они имеют вид $type=method. В частности, если использована опция –ms (не упаковывать уже сжатые файлы), то запись для –m4 будет преобразована в –m4b/4t/$compressed=0, где “0” (т.е. –m0) – это метод сжатия, который будет применён к файлам, включенным в группу $compressed.

Затем к этому списку добавляются методы сжатия для мультимедийных файлов и он уже выглядит как –m4b/4t/$compressed=0/$wav=wav/$bmp=bmp. И это всё ещё совершенно законная запись опции –m, которую можно задать в командной строке. Она расшифровывается как “сжимать файлы из группы $bmp алгоритмом bmp, группы $wav – алгоритмом wav, группы $compressed – алгоритмом 0, группы $text – алгоритмом 4t, и наконец оставшиеся - алгоритмом 4b”.

На следующем шаге происходит «дорасшифровка» первого элемента записи и она превращается в –mexe+4b/$obj=4b/$text=4t/$compressed=0/$wav=wav/$bmp=bmp. Это связано с необходимостью выделить файлы с перемещаемым объектным кодом (*.obj, *.lib и т.п.) в отдельную группу, к которой не применяется exe-препроцессинг, ухудшающий для них степень сжатия. Запись “exe+4b” означает «применить к исходным данным алгоритм exe, затем сжать его выход алгоритмом 4b». Вы можете соединять в цепочку любые алгоритмы, хотя реально имеет смысл применять сначала препроцессоры (exe, rep, delta, mm, lzp, dict) и завершать цепочку упаковщиком (lzma, ppmd, grzip, tor, tta).

Наконец, подходит пора заменить использованные аббревиатуры (4b,4t) на реальные методы сжатия, а точнее даже целые цепочки методов. После этого преобразования запись превращается в

–mexe+rep:64mb+delta+lzma:8mb/$obj=rep:64mb+delta+lzma:8mb/$text=dict:p+lzp+ppmd:8:96mb/$wav=tta/$bmp=mm+grzip

– причём здесь я ещё опустил половину подробностей. Как видите, сокращённая запись метода сжатия спасает целые жизни J. rep, lzma, которые вы здесь видите – это уже реальные алгоритмы сжатия, а не аббревиатуры. Через двоеточия задаются значения их параметров вместо используемых по умолчанию.

Когда вам необходим тонкий контроль над выбором алгоритмов сжатия, вы всегда можете воспользоваться уточнениями в опции –m для задания того, как сжимать отдельные типы файлов или из каких методов и с какими параметрами сконструировать алгоритм сжатия. Используйте запись типа –m4b/3t если вы хотите задать отдельно методы сжатия для текстовых и бинарных файлов. Добавляйте записи вида $type=method если вы хотите уточнить методы сжатия для определённых типов файлов, например –m4/$html=2t или –m4b/3t/$html=2t. Наконец, используйте запись реальных алгоритмов сжатия (lzma, ppmd, dict и т.д.) и цепочки методов (dict+lzp+ppmd) вместо аббревиатур (4b,2t), если вам нужно сконструировать нестандартный алгоритм сжатия. Опция -di позволит вам проследить за результатами своего творчества J.

Следует иметь в виду, что спецметоды сжатия для мультимедийных файлов добавляются в командную строку только при использовании опций –mN или –mNx. Если вы записываете основной метод сжатия (т.е. то, что до “$”) в более расшифрованном виде, то вам придётся добавить их вручную. Таким образом, опция –m4 в точности эквивалентна записи –m4b/4t/$wav=wav/$bmp=bmp. Вы также можете добавить к текущим настройкам сжатия дополнительные алгоритмы для отдельных типов файлов, используя опцию в виде –m$type=method; например –m5 –m$wav=lzma аналогично –m5/$wav=lzma. В частности, опция –ms эквивалентна –m$compressed=rep:8mb:128+tor:2:64k.

Вы можете вывести полный список подстановок, встроенных в программу, командой arc --print-config и дополнить их своими собственными подстановками, задав их в arc.ini. В целом эта система подстановок нацелена на то, чтобы дать вам возможность максимально гибко настраивать способы сжатия и в то же время удобно выбирать нужные настройки при каждодневном использовании.

## Выбор алгоритмов сжатия

Вернёмся к расшифровке алгоритма сжатия по умолчанию:

–m exe+rep:64mb+table+lzma:8mb / $obj=rep:64mb+table+lzma:8mb / $text=dict:p+lzp+ppmd:8:96mb / $wav=tta / $bmp=mm+grzip

Как видите, алгоритм сжатия для каждого типа файлов состоит из одного или нескольких процессов, разделённых знаками плюс. При этом первые процессы в цепочке исполняют роль препроцессоров, уменьшающих избыточность файла, а последний процесс осуществляет окончательное сжатие. После названия каждого процесса через двоеточия могут записываться дополнительные параметры, однако они необязательны – все настройки имеют значения по умолчанию. Алгоритм сжатия следует выбирать в соответствии с типом сжимаемых данных и требуемым соотношение скорость/сжатие, в частности (все скорости приведены для одноядерного процессора с частотой 1ГГц):

· для текстовых файлов (включая сюда исходники программ, html/xml/ps файлы и многие другие форматы файлов, представляющие собой по существу обычный текст) следует использовать grzip, ppmd или pmm – в зависимости от требуемого уровня скорости/сжатия. grzip:m4 – самый быстрый алгоритм сжатия для текстов, grzip:m1 близок к ppmd – на несколько процентов хуже сжатие, зато вдвое быстрее распаковка. Для увеличения сжатия в ppmd/pmm надо увеличивать порядок модели и одновременно объём используемой памяти. Скорость работы grzip – несколько мб/сек, ppmd – 1-2 мб/сек, pmm – 100-300 кб/сек. Все эти алгоритмы (почти) симметричны, поэтому требования к памяти при распаковке и её скорость почти не отличаются от параметров упаковки. Только grzip:m1 распаковывает вдвое быстрее, чем сжимает. Алгоритм pmm реализуется путём вызова внешней программы ppmonstr.exe, присутствие которой необходимо и для упаковки, и для распаковки, причём в одной и той же версии

· для бинарных файлов (в том числе, кстати, и текстов с 16/32-битными кодировками) следует использовать lzma. lzma:fast даёт быстрое сжатие, сравнимое с RAR. Дальнейшее ускорение можно получить, используя меньшие значения параметров fb и mc, например lzma:fast:fb5:mc1. По умолчанию lzma использует сильное сжатие, его можно ещё больше увеличить с помощью увеличения тех же параметров fb и mc, например lzma:fb128. Ещё один параметр – размер словаря. Для упаковки нужно 10*dictsize байт памяти, для распаковки – dictsize. Скорость распаковки – 10 мб/с, упаковки – 200кб-2мб/с в зависимости от выбранной степени сжатия, на 2-ядерных процессорах упаковка на 70% быстрее. lzma можно также использовать для текстовых данных, когда нужно обеспечить большую скорость распаковки

· для очень быстрой упаковки предназначен алгоритм tor (Tornado). Режимы от tor:1 до tor:7 предоставляют диапазон скоростей сжатия от 100 мб/с до 4 мб/с

· для чисто звуковых файлов (wave audio) лучше всего, конечно, подойдёт специальный кодек tta, скорость которого 3-10 мб/с

· для прочих мультимедийных файлов следует использовать универсальный набор mm+grzip. Препроцессор мультимедиа-данных mm распознаёт тип мультимедии (к примеру, «2 канала по 16 бит с заголовком в 44 байта») и производит поканальное вычитание, улучшающее последующее сжатие grzip. Препроцессор mm можно применять в сочетании и с другими алгоритмами сжатия (ppmd, lzma), но сжатие при этом будет немного хуже. Однако поскольку lzma распаковывает данные в 5-10 раз быстрее, чем grzip, цепочка mm+lzma хорошо подходит для реализации ассиметричных режимов мультимедиа-сжатия

Использование препроцессоров перед основным алгоритмом упаковки позволяет выжать ещё несколько процентов сжатия. Для бинарных данных можно использовать следующие препроцессоры:

· exe – преобразует исполняемый код для улучшения сжатия. При использовании совместно с другими алгоритмами должен быть первым в цепочке. На obj/lib файлах (т.е. файлах с перемещаемым объектным кодом) ухудшает сжатие, поэтому FreeArc настроен так, что эти файлы выделены в отдельную группу, к которой этот препроцессор не применяется. Чуть-чуть ухудшает сжатие файлов без объектного кода

· rep – удаляет повторы на больших расстояниях. Учитывая, что lzma может использовать словарь только в 1/16 от объёма наличной памяти, а rep – в 1/2 от этого объёма, их выгодно комбинировать вместе: сначала rep кодирует повторы на длинных дистанциях, а затем lzma осуществляет основное сжатие, например rep:512mb+lzma:64mb обеспечит высокое сжатие на машине с 1 гб памяти в то время как lzma:512mb на ней не смог бы, разумеется, развернуться. Требования rep к памяти – 1.25*dictsize. В цепочке его лучше ставить сразу после exe, поскольку он обладает большой скоростью и уменьшает объём данных и следовательно время работы последующих алгоритмов

· delta – находит и обрабатывает табличные данные, встречающиеся в исполняемых файлах, базах данных и многих других типах файлов

Для текстовых данных можно использовать следующие препроцессоры:

· dict – находит многократно повторяющиеся последовательности байтов («слова») и заменяет их на 1-2 байтовые коды

· lzp – аналогично rep, находит повторяющиеся строки, но рассчитан на обработку текстовых данных

С grzip оба эти препроцессора обычно не используются – lzp потому, что он и так уже встроен в grzip, а dict – потому что от него в сочетании с bwt/st мало толку. Особенно благоприятно использование этих препроцессоров сказывается на lzma и pmm, поскольку позволяет не только улучшить сжатие, но и значительно ускорить их работу.

Вы можете увидеть практическое использование всех этих рекомендаций в таблице реализации методов сжатия, которая распечатывается командой arc --print-config.

## Параметры алгоритмов сжатия

Следующая таблица описывает для каждого алгоритма сжатия смысл его параметров, задаваемых через двоеточия (например ppmd: o10: mem96m: r1) и их значения по умолчанию:

Параметр и его значение по умолчанию | Описание
PPMD
o10 | Порядок модели, т.е. количество символов, по которым осуществляется предсказание следующего символа. Может быть также указано без префикса: ppmd:4
mem48mb | Объём памяти, используемой под модель. Также можно указывать в виде “m96mb” и даже “96mb”, т.е. с префиксом “m” или вовсе без префикса. О том, каким образом задаются объёмы памяти, см. раздел Задание опций Error! Bookmark not defined.
r0 | Режим обновления модели (0/1/2). “r” эквивалентно “r1”
PMM
o16 | Порядок модели, т.е. количество символов, по которым осуществляется предсказание следующего символа. Может быть также указано без префикса: pmm:10
mem192mb | Объём памяти, используемой под модель. Также можно указывать в виде “m96mb” и даже “96mb”, т.е. с префиксом “m” или вовсе без префикса. О том, каким образом задаются объёмы памяти, см. раздел Задание опций Error! Bookmark not defined.
r1 | Режим обновления модели (0/1/2). “r” эквивалентно “r1”
LZMA
a1 | Алгоритм поиска соответствий: “a0” – быстрый, “a1” – нормальный. С a0 лучше использовать hc4 match finder (см. ниже), а с a1 – bt4
d8mb | Максимальная дистанция поиска соответствий (словарь). Задаётся как объём памяти, см. раздел Задание опций Error! Bookmark not defined.. Этот параметр можно указывать без префикса: lzma:4m
fb32 | Минимальная длина найденного соответствия, после которого останавливается поиск более удачных (ещё более длинных) соответствий. Уменьшение этого параметра способно значительно увеличить скорость упаковки за счёт уменьшения степени сжатия. Этот параметр можно указывать без префикса: lzma:16. Увеличьте его до 128, если вам нужно добиться максимального сжатия
mc0 | Максимальная длина цепочки поиска. Настройка mc0 устанавливает его в значение по умолчанию, которое зависит от параметров a и fb: mc = a==1? fb/2+16 : fb/4+8. Значение этого параметра напрямую влияет на соотношение скорость работы/степень сжатия
lc3 | Смысл этого параметра известен только Игорю Павлову, автору алгоритма LZMA J
lp0 | -.-
pb2 | -.-
mfBT4 | Match finder. После “mf” можно указать один из следующих типов: "bt2", "bt3", "bt4", "hc4". Подробное описание их особенностей можно найти в документации на 7-zip. Этот параметр можно указывать без префикса: lzma: hc4
| Для удобства использования введены также несколько сокращений: · fastest = a0:hc4:fb6:mc1 · fast = a0:hc4:fb32:mc0 · normal = a1:bt4:fb32:mc0 · max = a1:bt4:fb128:mc0 · ultra = a1:bt4:fb128:mc10000 Таким образом, к примеру, самое быстрое lzma сжатие можно задать как lzma: fastest:32k, а самое мощное – как lzma: ultra:256m. Настройки по умолчанию эквивалентны lzma:normal:8m
GRZip
m1 | Метод сжатия (от самого плотного к самому быстрому: m1 – BWT+WFC, m2 – BWT+MTF, m3 – ST4+WFC, m4 – ST4+MTF)
b8mb | Размер блока упаковываемых данных. Задаётся как объём памяти, см. раздел Задание опций Error! Bookmark not defined.. Этот параметр можно указывать без префикса: grzip:4m
l32 | Мин. длина соответствия, используемая при LZP-препроцессинге. Этот параметр можно указывать также без префикса: grzip:64
h15 | Логарифм кол-ва элементов в хеш-таблице, используемой при LZP-препроцессинге. Уменьшение этого параметра ускоряет упаковку и распаковку, но уменьшает степень сжатия, особенно на данных с большим кол-вом небольших повторяющихся строк, как например тексты. Для достижения максимального сжатия этот параметр можно увеличить, скажем, до 20
s | Использовать альтернативный алгоритм сортировки в BWT-режиме. Практического значения не имеет
a | Использовать эвристический алгоритм для разбиения данных на блоки меньшего размера
l | Отключить использование LZP-препроцессора. На некоторых данных (например, на текстах книг) этот препроцессор не даёт заметного выигрыша в сжатии, но увеличивает время и упаковки, и распаковки
d | Включить эвристический препроцессор для мультимедийных данных
p | Отключить все препроцессоры (LZP, мультимедийный, разбиение данных на блоки меньшего размера). Следует заметить, что по умолчанию все они, окромя LZP, и так отключены, а LZP с таким же успехом отключается и параметром l. Так что это скорее подстраховка на будущее, когда в алгоритм GRZip могут быть добавлены новые препроцессоры
LZP
| Надо заметить, что алгоритм LZP – это тот же самый LZP-препроцессор из GRZip, слегка видоизменённый Димой Шкариным для более эффективного использования совместно с ppmd/pmm. Посему его базовые параметры не отличаются от параметров LZP-препроцессора в алгоритме GRZip, хотя я добавил к ним некоторые новые возможности
b8mb | Размер блока упаковываемых данных. Задаётся как объём памяти, см. раздел Задание опций Error! Bookmark not defined.. Этот параметр можно указывать также без префикса: lzp:4m. Объём памяти, требуемой и для упаковки, и для распаковки – 2*blocksize
l64 | Мин. длина соответствия. Этот параметр можно указывать также без префикса: lzp:85. При использовании LZP как препроцессора к алгоритму PPMD автор рекомендует использовать значение, вычисленное по формуле ppmdOrder*10-15
h18 | Логарифм кол-ва элементов в хеш-таблице. Уменьшение этого параметра ускоряет упаковку и распаковку, но уменьшает степень сжатия, особенно на данных с большим кол-вом небольших повторяющихся строк, как например тексты. Для достижения максимальной степени сжатия этот параметр можно увеличить, скажем, до 24, что потребует 4*2^24 = 64 мб памяти сверх вышеупомянутых 2*blocksize
d | Граница, после которой требования к длине строк уменьшаются, что позволяет строить двухступенчатый механизм – скажем, до дистанции 8 мб отбираем строки от 64 байт, после – от 32 байт: lzp:64: d8m: s32
s32 | Требования к длине строк после пересечения барьера (если этот параметр больше :l, то его значение сбрасывается до :l)
100% | Блоки данных, степень сжатия которых оказалась хуже указанного кол-ва процентов, запоминаются в несжатом виде
REP
b64mb | Максимальная дистанция поиска соответствий (словарь). Задаётся как объём памяти, см. раздел Задание опций Error! Bookmark not defined.. Этот параметр можно указывать без префикса: rep:512m. Объём памяти, требуемой для упаковки – 1.25*dictsize, для распаковки – dictsize
l512 | Мин. длина соответствия. Этот параметр можно указывать также без префикса: rep:32. Наилучшее значение – 512, поскольку если rep начнёт «перехватывать» строки меньших размеров, то общий уровень сжатия совместно с последующим lzma уменьшится
h0 | Логарифм кол-ва элементов в хеш-таблице. Значение 0 обозначает, что программа выбирает размер хэша сама – в размере 0.25*dictsize. Для достижения максимальной степени сжатия этот параметр можно увеличить (особенно большое влияние это оказывает при небольшом размере параметра :l, например, :l32). К примеру, если задать h24, то размер хэша будет 4*2^24 = 64 мб
a1 | Коэффициент «усиления поиска». Использование значений больше 1 позволяет находить чуть больше совпадений за счёт уменьшения скорости сжатия. Этот параметр может использоваться для достижения максимального сжатия: rep: a99
d | Граница, после которой требования к длине строк уменьшаются, что позволяет строить двухступенчатый механизм – скажем, до дистанции 8 мб отбираем строки от 512 байт, после – от 32 байт. Это может иметь смысл, если lzma всё равно ограничен дистанцией 8мб: rep:512: d8m: s32+lzma:8m
s512 | Требования к длине строк после пересечения барьера (если этот параметр больше :l, то его значение сбрасывается до :l)
DICT
b64mb | Размер блока упаковываемых данных. Задаётся как объём памяти, см. раздел Задание опций Error! Bookmark not defined.. Этот параметр можно указывать также без префикса: dict:32m. Объём памяти, требуемой для упаковки – 1.5*blocksize, для распаковки – blocksize
p | Настроить параметры алгоритма на использование совместно с ppmd/pmm или bwt/st алгоритмами (по умолчанию параметры настроены на использование совместно с lzma). Эта настройка ужесточает критерии отбора слов, поскольку для более мощных алгоритмов сжатия редкие слова (скажем, встречающиеся в блоке всего 30-100 раз) лучше не кодировать
100% | Блоки данных, степень сжатия которых оказалась хуже указанного кол-ва процентов, запоминаются в несжатом виде. Пример: dict:90%
TTA
| За исключением возможности регулировать уровень сжатия, все остальные параметры этого алгоритма полностью повторяют параметры алгоритма MM
m3 | Уровень сжатия. m1 – самый быстрый (10 мб/с), m3 – самый медленный (3 мб/с) и самый плотный
MM
s | Параметр :s отключает анализ заголовков файлов (где записывается тип данных) и заставляет MM определять количество каналов и их битность только на основе анализа содержимого файла
d9 | Этот параметр позволяет задать ускоренный анализ содержимого файла (задаётся как :d1)
c0 | Задаёт количество каналов в кодируемом файле. Значение большее 0 отключает автоопределение типа данных
w0 | Задаёт ширину в битах каждого канала в файле. Значение большее 0 отключает автоопределение типа данных
c*w | Отключить анализ заголовка/данных и форсировать кодирование данных как содержащих c каналов шириной по w бит. Пример: mm:2*16, что эквивалентно mm: c2:w16
o0 | Пропустить заданное кол-во байт в начале файла (т.е. скопировать их как есть вместо мультимедиа-кодирования). Применяется совместно с предыдущими параметрами, например mm: o44:2*16
TOR
5 | Уровень сжатия, от 1 до 12. На практике использование уровней выше 7-го не имеет смысла, поскольку они уступают lzma по своим характеристикам. Таблица скоростей: · tor:1 – 50-100 мб/с · tor:3 – 20-30 мб/с · tor:5 – 5-10 мб/с · tor:7 – 3-5 мб/с Этот параметр автоматически настраивает все остальные, так что в большинстве случаев о них не к чему беспокоиться
b16mb | Размер скользящего окна, в пределах которого ищутся повторы данных. Можно указывать без префикса, например tor:4m
h8mb | Объём памяти, используемой для хеш-таблицы
l4 | Глубина поиска: большие значения улучшают сжатие, но замедляют его
u999 | Регулярность обновления статистики внутри найденных строк. u1 задаёт наиболее медленный и плотный режим сжатия; используя параметр u1 или u2, можно на пару процентов улучшить сжатие за счёт его двукратного замедления
EXE
| Этот алгоритм не имеет никаких настроек
DELTA
| Этот алгоритм также не имеет никаких настроек

## Внешние компрессоры

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

· pmm: ppmonstr – мощный упаковщик текстовых данных

· precomp: препроцессор для сжатых файлов, распаковывающий их

· ecm: препроцессор для iso-образов, удаляющий из них избыточную CRC информацию

Прилагаемый вариант arc.ini задействует эти алгоритмы в режимах –max и –m#p для групп файлов $text, $precomp/$jpgsolid и $iso, соответственно, поэтому наличие ppmonstr.exe в PATH необходимо для этих режимов сжатия, а наличие остальных exe-шников в PATH ещё больше увеличит степень сжатия. При отсутствии программы в PATH соответствующий шаг в цепочке сжатия будет просто пропущен и при распаковке такого архива эта программа, разумеется, не будет требоваться.

Также в моём arc.ini определены несколько упаковщиков общего назначения. Перечислю их в порядке возрастания степени сжатия:

· dul: durilca’light – ppmd, обвешанный дополнительными эвристиками и препроцессорами

· ccm/ccmx: fast context mixing compressor by Christian Martelock

· lpaq - «очень быстрый paq» by Matt Mahoney & Alexander Ratushnyak

· dur: durilca – ppmonstr с максимальными настройками, обвешанный дополнительными эвристиками и препроцессорами

· uda: «быстрый paq» by dwing

· paq: наиболее мощный упаковщик на данный момент, хотя и очень медленный, первоначальный автор Matt Mahoney

Вы можете паковать этими алгоритмами для достижения ещё большей степени сжатия при сохранении всех преимуществ надёжности и функциональности, предоставляемых FreeArc. Кроме того, их можно (и нужно) сочетать с внутренними и внешними препроцессорами (такими, как dict или precomp) для достижения характеристик, недоступных оригинальным программам в чистом виде. Не забывайте, однако, что все использованные упаковщики потребуются и при распаковке!

uda требуется для работы 200 мб памяти, ccm(x), (l)paq, durilca и durilca’light в моём arc.ini настроены на использование 276-450 мб – вы можете изменить эти настройки под свои требования. ecm и precomp требуют не больше 10 мб памяти.

В заключение приведу ссылки для загрузки этих программ:

· ppmonstr: http://www.compression.ru/ds/ (качайте ppmd)

· precomp: http://schnaader.info

· ecm: http://www.neillcorlett.com/downloads/ecm100.zip

· durilca & durilca’light: http://www.compression.ru/ds/durilca.rar

· ccm: http://www.geocities.com/lovepimple_mail/downloads/ccm125.zip

· paq, lpaq: http://cs.fit.edu/~mmahoney/compression/

· uda: http://wex.cn/dwing/download/uda0301s.7z

## Блочные алгоритмы

Блочными называются алгоритмы сжатия, которые сжимают каждый блок данных независимо от остальных. При этом они считывают данные большим блоком, обрабатывают их, выводят сжатые данные, затем считывают следующий блок и т.д. Из реализованных в настоящее время в программе к ним относятся grzip, mm+grzip, lzp и любые цепочки алгоритмов, начинающиеся с dict. Размер блока в них – один из параметров алгоритма (для mm+grzip это размер блока grzip, для dict+… это размер блока dict).

#

# Конфиг-файл arc.ini

Архиватор может быть дополнительно настроен с помощью конфиг-файла arc.ini, который должен находиться в том же каталоге, что и Arc.exe (под Windows) или в каталоге /etc (в Unix). Пример содержимого конфиг-файла:

;Default options for all commands

--logfile=c:\temp\freearc.log --display=hnwfts

[Default options]

;Default options for specific commands

a create = -m5 -ms

create = --display

[Compression methods]

6pt = dict:p + lzp:64mb:32:h22 + pmm:16:400mb

#d = #b / #xt ;One more comment

#d$bmp = bmp

#d$wav = wavfast

Во-первых, в нём допускаются комментарии, начинающиеся с ‘;’, причём комментарий может занимать отдельную строку или стоять в конце строки. Первая (не пустая и не являющаяся комментарием) строка конфиг-файла может содержать опции, общие для всех команд. Всё остальное содержимое конфиг-файла разбито на секции, заголовки которых заключаются в квадратные скобки: [Default options], [Compression methods]. Секция [Default options] описывает опции по умолчанию для отдельных команд. Слева от знака ‘=’ записываются команды, к которым применяются эти опции, а справа – сами опции. При этом одна и та же команда может встречаться в нескольких строках, тогда все заданные для неё опции суммируются. Например, вышеописанный конфиг-файл задаёт опции по умолчанию для команды ‘create’: -m5 –ms --display.

## Секция [Compression methods]

Секция [Compression methods] позволяет описать сокращённые обозначения для методов сжатия. Все встроенные в архиватор методы сжатия описаны таким же образом, вы можете вывести их описания командой arc --print-config и даже вставить эти описания в свой конфиг-файл. Поскольку описания методов из конфиг-файла имеют больший приоритет, чем встроенные в программу, вы можете настроить их по своему вкусу и использовать те параметры, которые считаете нужным. Внутри архива описания методов хранятся в расшифрованном виде, поэтому это не создаст никаких проблем несовместимости. С другой стороны, вы можете создавать свои собственные методы сжатия, точнее сокращения, которые облегчат их указание в командной строке. Например, вышеприведённый конфиг-файл описывает метод 6pt, который будет использоваться для сжатия текстовых файлов в -m6p. Кроме того, он описывает целое семейство методов сжатия –m1d..-m9d, которые сочетают сжатие бинарных файлов, используемое в –m#, и сжатие текстовых файлов, используемое в –m#x.

Язык описания опций сжатия требует некоторых пояснений. При использовании # в описании эта строка автоматом заменяется на 9 строк, где # пробегает значения от 1 до 9, поэтому строка

#d = #b / #xt

из вышеприведённого конфиг-файла эквивалентна:

1d = 1b / 1xt

...

9d = 9b / 9xt

Каждая строка в этой секции задаёт возможную подстановку, используемую при расшифровке методов сжатия: левая часть этой строки (до знака ‘=’) заменяется на правую. Таким образом, -m3d заменяется на -m3b/3xt, т.е. мы программируем -m3d как опцию сжатия, эквивалентную –m3b для бинарных файлов, и –m3xt для текстовых. Расшифровку же этих методов сжатия можно увидеть по команде arc --print-config:

3b = rep:32m + 3xb

3xt = dict:32m:80% + 3xb

Как видите, обе записи ссылаются на расшифровку метода 3xb, который можно найти здесь же:

3xb = lzma:4m: fast: mc8

Таким образом, -m3d будет использовать rep:32m + lzma:4m: fast: mc8 для сжатия бинарных файлов, и dict:32m:80% + lzma:4m: fast: mc8 для текстовых. Не правда ли, элементарно? J Осталось только добавить, что для файлов, которые могут оказаться исполняемыми, будет добавлен препроцессор exe. Полную расшифровку метода сжатия можно увидеть, задав при архивации опцию -di.

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

#d$bmp = bmp

#d$wav = wavfast

Альтернативным способом запрограммировать всё это была бы одна-единственная строчка:

#d = #b / #xt / $bmp = bmp / $wav = wavfast

Как видите, это очень схоже с вариантами задания опции –m в командной строке. Пробелы можно использовать свободно – перед использованием все они удаляются.

При задании в командной строке, к примеру, опции –m3d в конфиг-файле будут найдены строки, начинающиеся с –m3d$, и их содержимое добавлено к расшифровке метода сжатия. Таким образом, –m3d будет расшифровано как –m3b/3xt/$bmp=bmp/$wav=wavfast. Точно таким же образом мультимедиа-сжатие добавляется для обычных методов –mN/–mNx, только соответствующие подстановки включены непосредственно в программу. Вы можете их распечатать командой arc --print-config. Обратите внимание, что алгоритмы сжатия мультимедийных файлов варьируются в зависимости от режима сжатия – это сделано для достижения требуемых параметров производительности.

Строки в arc.ini имеют больший приоритет, нежели встроенные в программу, а в каждом из этих групп в свою очередь строки без ‘#’ имеют больший приоритет, нежели строки с ‘#’.

## Секции [External compressor]

Эти секции позволяют описать алгоритмы сжатия и препроцессинга, использующие внешние программы, такие как PAQ и CCM. Примеры таких секций:

[External compressor:precomp]

mem = 2

packcmd = precomp -o$$arcpackedfile$$.tmp $$arcdatafile$$.tmp

unpackcmd = precomp -o$$arcdatafile$$.tmp -r $$arcpackedfile$$.tmp

[External compressor:jpg]

mem = 10

packcmd = packjpg $$arcdatafile$$.jpg

unpackcmd = packjpg $$arcdatafile$$.pjg

datafile = $$arcdatafile$$.jpg

packedfile = $$arcdatafile$$.pjg

В заголовке секции после ‘:’ задаётся погоняло нового алгоритма. packcmd и unpackcmd описывают команды упаковки и распаковки, соответственно. packedfile и datafile – имена упакованного и распакованного файлов, с которыми работают обе команды; по умолчанию это $$arcpackedfile$$.tmp и $$arcdatafile$$.tmp. cmem и dmem описывают объём памяти, используемый при упаковке и распаковке (если они одинаковы, то можно задать оба размера с помощью mem).

Можно описать сразу несколько версий/вариаций одной программы, если они имеют одинаковый формат вызова:

[External compressor:ccm123,ccmx123,ccm125,ccmx125]

mem = 276

packcmd = {compressor} c 4 $$arcdatafile$$.tmp $$arcpackedfile$$.tmp

unpackcmd = {compressor} d $$arcpackedfile$$.tmp $$arcdatafile$$.tmp

При этом строки {compressor} в описании заменяются на название метода сжатия, т.е это описание эквивалентно следующему:

[External compressor:ccm123]

mem = 276

packcmd = ccm123 c 4 $$arcdatafile$$.tmp $$arcpackedfile$$.tmp

unpackcmd = ccm123 d $$arcpackedfile$$.tmp $$arcdatafile$$.tmp

[External compressor:ccmx123]

mem = 276

packcmd = ccmx123 c 4 $$arcdatafile$$.tmp $$arcpackedfile$$.tmp

unpackcmd = ccmx123 d $$arcpackedfile$$.tmp $$arcdatafile$$.tmp

…

При использовании компрессоров, у которых формат упакованных данных меняется от версии к версии (как у CCM), рекомендуется переименовывать exe-шники по номеру версии (ccm123.exe, ccmx125.exe…) и описывать их в arc.ini вышеприведённым способом. Затем добавьте в секцию [Compression methods] алиас на последнюю версию программы:

[Compression methods]

ccm=ccm125

ccmx=ccmx125

Пример использования вышеописанных алгоритмов для определения нового метода сжатия в arc.ini:

[Compression methods]

super = precomp+ccm / $jpg=jpg

Теперь используйте опцию –m=super и вуаля!

В файле arc.ini из комплекта поставки программы вы сможете найти другие примеры описания внешних компрессоров и использования их для улучшения сжатия в режимах –m#p/-max.

#

# Информация для разработчиков

## Компиляция из исходников

Исходники программы можно загрузить с http://www.haskell.org/bz/arc.htm. Они включают файл readme.txt, описывающий процесс установки компилятора GHC и компиляции программы под Windows и Unix.

## Добавление в программу новых алгоритмов сжатия

Для начала, создайте в каталоге, где находятся исходники FreeArc, подкаталог с названием “C_<method>”, где method – это название реализовываемого алгоритма. Помещайте в этот каталог все файлы, необходимые для реализации вашего алгоритма. Возьмите за основу для своего makefile, C_<method>.h, C_<method>.cpp аналогичные файлы из каталога C_GRZip. Замените в них все упоминания grzip на название вашего метода сжатия. Затем отредактируйте описание класса C_<method>, чтобы он включал все параметры вашего метода сжатия и только их, и измените реализацию этого класса, чтобы она соответствовала его описанию. Не забудьте про parse_<method>.

Все алгоритмы сжатия и препроцессинга, используемые в программе, должны быть приведены к стандартному интерфейсу: функция упаковки, получающая параметры алгоритма, необходимые для упаковки, и ссылки на callbacks для чтения и записи данных; и функция распаковки, получающая параметры алгоритма, необходимые для распаковки, и ссылки на такие же callbacks. Например:

typedef int INOUT_FUNC(void *buf, int size); // Объявлено в Compression.h

int superzip_compress(int dictionary, int level, INOUT_FUNC *read_f, INOUT_FUNC *write_f);

int superzip_decompress(int dictionary, INOUT_FUNC *read_f, INOUT_FUNC *write_f);

Далее, алгоритм упаковки/распаковки осуществляет свою работу, вызывая функцию read_f для получения входных данных:

insize = read_f( buf, bufsize);

Этой функции передаётся адрес буфера, куда нужно прочитать входные данные, и его размер в байтах. Она возвращает:

· отрицательное число – код ошибки

· ноль – признак завершения входных данных

· положительное число – количество прочитанных байт

Функция write_f вызывается для записи выходных данных:

result = write_f( buf, bufsize);

Этой функции передаётся адрес буфера, где находятся выходные данные и количество записываемых байт. Она возвращает:

· отрицательное число – код ошибки

· ноль или положительное число – признак успеха

При получении отрицательного результата от любой из этих функций желательно тут же прекратить процесс упаковки/распаковки и возвратить полученное число как результат работы всей процедуры compress/decompress. После получения нулевого ответа от функции read_f запрещено вызывать её снова – иначе результаты могут быть непредсказуемы. Все буфера выделяются вашими процедурами, по возвращении из процедуры write_f содержимое буфера уже записано и его можно переписывать новыми данными. При возвращении из процесса упаковки/распаковки следует освободить все выделенные блоки памяти. Следует включить (с помощью #include) в свой код файл "../Compression.h" – в нём находятся все необходимые для связи с FreeArc определения. Желательно читать и записывать данные блоками по BUFFER_SIZE байт (эта константа также находится в Compression.h).

После того, как вы определили функции упаковки и распаковки на С/C++ (to do: предоставить код для тестирования алгоритмов упаковки/распаковки непосредственно на С), можно приступать к подключению их к FreeArc. Добавьте к Compression/compile.cmd вызов make для вашего makefile, и включите в compile.btm объектный файл вашего метода сжатия рядом с c_grzip.o.