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

Цели создания. 1

Использование FreeArc. 2

Установка на компьютер. 2

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

Список команд. 3

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

Список опций. 5

Задание опций. 8

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

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

Настройка сжатия. 10

Типы файлов. 12

Настройка параметров алгоритма сжатия. 13

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

Цепочка алгоритмов упаковки. 16

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

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

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

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

 

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

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

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

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

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

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

 

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

·       надёжного

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

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

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

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

 

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

 

Использование FreeArc

Установка на компьютер

Для установки FreeArc на компьютер скопируйте файлы Arc.exe, Arc.groups и Arc.sfx в каталог, включённый в PATH.

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

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

Работа с 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-“.

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

a

Добавить файлы в архив. Файлы с такими же именами, уже существующие в архиве, будут безусловно перезаписаны (см. также команды “u”, “f”, “sync”)

create

Создать новый архив. Стереть архив с заданным именем, если он уже существует, и затем действовать как по команде “a

f

Обновить файлы в архиве. Эквивалентно использованию команды “a” с опцией “-f

u

Обновить файлы в архиве и добавить новые файлы. Эквивалентно использованию команды “a” с опцией “-u

m

Переместить файлы в архив. Эквивалентно команде “a” с удалением файлов, если архивация прошла успешно (в бета-версии удаление файлов не реализовано во избежание потери данных)

j

Объединить архивы. Файлы, указанные в командной строке, должны быть архивами. Их содержимое будет добавлено к основному архиву. Если в основном архиве и одном из добавляемых есть файлы с одинаковыми именами, то в объединённом архиве останется только файл из добавляемого архива. «Исходный архив» может не существовать до начала выполнения команды, в этом случае произойдёт объединение уже существующих архивов с созданием нового. Примеры: “Arc j new.arc old1.arc old2.arc”, “Arc j new old[34]”, “Arc j All_Together c:\* -r”.

d

Удалить файлы из архива

y

Скопировать архив, внося в него попутно изменения. Например, этими изменениями могут быть добавление комментариев к архиву, его закрытие от дальнейших изменений и т.д. Если в командной строке указаны имена файлов, то копируются только эти файлы. Файлы, указанные в опции “-x”, исключаются из архива (можно сказать, что команда “y” оставляет в архиве в точности те файлы, которые команда “d” удалила бы J)

c

Задать комментарий к архиву. Полностью эквивалентна команде “y -z

k

Закрыть архив от дальнейших изменений. Полностью эквивалентна команде “y -k

e

Извлечь файлы из архива в текущий каталог (или в каталог, указанный опцией –dp)

x

Извлечь файлы из архива с полными путями

t

Протестировать файлы из архива, распаковывая их в память и проверяя CRC

l

Создать листинг файлов в архиве

v

Создать технический листинг архива, предназначенный главным образом для архиваторных оболочек

Поиск файлов

Все команды можно разделить на две большие группы: для команд архивации и слияния архивов (a f u m 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”.

 

 

Для всех остальных команд имена, указанные в командной строке, обозначают файлы в архиве (разумеется, кроме имени самого обрабатываемого архива J). Ссылки на листфайлы (“@listfile”) точно так же заменяются их содержимым.  

.........подробней........

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

 

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

В масках можно использовать обозначения “?” (обозначает любой символ), "*" (обозначает любую последовательность символов, в т.ч. пустую), “[…]” (обозначает любой символ из множества, перечисленного в скобках; возможно использование диапазонов и отрицание, так “[0-9]” соответствует любой цифре, а “[^aeo]” – любому символу, кроме “a”, “e” и “o”). В именах каталогов маски не допускаются.

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

 

 

Имена архивов также могут быть заданы маской – при этом будут обработаны все найденные архивы, попадающие под неё. Более того, в тех командах, где опция “-r” не задействована для поиска в подкаталогах обрабатываемых файлов, она используется для поиска в подкаталогах обрабатываемых архивов (команды d, e, x, t, l, v). Например, эта команда протестирует все архивы на диске C:

Arc t c:\* -r 

Список опций

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

-cfg-

--config-

Отключить чтение опций по умолчанию из файла arc.ini и переменной среды FREEARC

-r

--recursive

Рекурсивный поиск заданных файлов в заданном (или текущем) каталоге и его подкаталогах

-f

--freshen

Обновить существующие файлы (при упаковке или распаковке)

-u

--update

Обновить существующие файлы и добавить новые (при упаковке или распаковке)

 

--sync

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

-o

--overwrite

Режим перезаписи файлов:

·        “-op” (значение опции по умолчанию) – выдавать запросы на перезапись

·        “-o+” – не задавая запросы, перезаписывать все файлы

·        “-o-” – не задавая запросы, пропускать все файлы

Подробности см. в разделе Запросы к пользователю.

-x

--exclude

Исключить из обработки заданные файлы или файлы из заданных файл-списков, например “Arc a backup -r -xcommon.h -x*.bak -x@exclude.lst -xdir/*”. Подробности см. в разделе Поиск файлов.

-ap

--arcpath

Базовый каталог внутри архива

-dp

--diskpath

Базовый каталог на диске. Например, команда “Arc x archive -apdir1 -dpdir2” извлечёт все файлы из каталога dir1 внутри архива в каталог dir2 на диске

-m

--method

Метод сжатия. Опции -m1..-m6 устанавливают различные режимы упаковки – от самого быстрого и требующего всего 16 мб памяти, до самого медленного и использующего 512 мб и при упаковке, и при распаковке. Опции -m1x..-m6x включают ассиметричный алгоритм сжатия (LZMA), в котором для распаковки нужно в 10 раз меньше памяти и в 3-20 раз меньше времени, но за это приходится платить уменьшением скорости упаковки и степени сжатия. В режиме по умолчанию (-m3) программа сжимает примерно на уровне RAR, в режиме -m4 – на уровне максимального сжатия RAR или режима по умолчанию в 7-Zip и UHARC. Остальные подробности см. в разделе Настройка сжатия  Error! Bookmark not defined.. Также традиционно поддерживается режим -m0 (отключение упаковки).

-dm

--dirmethod

Метод упаковки каталога архива и других служебных блоков. Все возможности аналогичны опции “-m”. По умолчанию – “-dm4x:512k”. Если вы не хотите, чтобы каталог архива был упакован –  используйте опцию “-dm0”. Учитывайте, что FAR MultiArc plugin может заходить только в архивы, каталоги которых упакованы методами lzma и storing (поскольку другие методы не дают для сжатия каталогов никаких преимуществ, их поддержка не была включена при сборке плагина).

-ms

--StoreCompressed

(Почти) не пытаться сжимать уже упакованные файлы. Какие файлы являются уже упакованными – определяется по их именам, так что здесь возможны ошибки и потому эта опция не включена по умолчанию. Подробности смотрите в разделе Настройка сжатия  Error! Bookmark not defined..

-ds

--definesort

Определить порядок сортировки файлов при архивации. По умолчанию – “gen”, т.е. сортировать по группе, расширению и базовому имени. Вы можете отключить сортировку указанием “-ds” без параметра, она также отключается автоматически при отключении солид-сжатия (-s-), архивации без сжатия (-m0), использовании fake сжатия (--nodata/--crconly). Смотрите подробности в разделе Сортировка файлов для солид-сжатия  Error! Bookmark not defined..

-g

--groups

Имя файла, задающего порядок сортировки файлов для улучшения сжатия и описывающего типы файлов. По умолчанию это arc.groups из того каталога, где находится сама программа. Подробности о его формате смотрите в разделах Сортировка файлов для солид-сжатия  Error! Bookmark not defined. и Типы файлов.

-s

--solid

Управляет размером солид-блока и разбиением на части каталога архива. По умолчанию размер солид-блока составляет 64 мб, а каталог разбивается на части, описывающие по 20 тысяч файлов. Опция “-s16m” изменит размер солид-блока на 16 мб, “-s100f” будет создавать солид-блоки по 100 файлов, а “-se” будет создавать отдельный солид-блок для каждого расширения файлов. Подробное описание этой опции см. в разделе Настройка солид-сжатия  Error! Bookmark not defined..

-t

--test

Протестировать после упаковки созданный архив. Дальнейшие действия, в том числе удаление сархивированных файлов, должны выполняться только при успешном результате тестирования, но это пока не реализовано

-kb

--keepbroken

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

-i

--indicator

Выбор индикатора прогресса:

·       -i0 – отключает вывод индикатора, в т.ч. в заголовке окна

·       -i1 (по умолчанию) – показывает только на сколько процентов выполнено задание

·       -i2 – дополнительно выводит имя каждого обрабатываемого файла, как это делается в большинстве архиваторов

-ad

--adddir

Добавить имя распаковываемого архива (без расширения) к имени каталога, куда будет происходить распаковка. Например, команда “Arc x * -ad” распакует все архивы в текущем каталоге в подкаталоги с теми же именами. При использовании одновременно с опцией “-dp” имя архива добавляется в самом конце

-ag

--autogenerate

Автоматическая генерация имени архива. К имени, указанному в командной строке, добавляется информация о текущей дате и времени. Например, “backup.arc” -> “backup20050302114328.arc”. Можно также явно указать формат добавляемой к имени архива строки в формате Си-шной функции strftime()

 

--noarcext

Если имя/маска архива указано без расширения, то к нему автоматически добавляется расширение “.arc”. Предотвратить это можно только одним способом – использовать опцию “--noarcextJ. Это относится и к именам архивов, объединяемых командой “j”. Эта опция в первую очередь предназначена для конфигурирования архиваторных оболочек.

-tk

--keeptime

Сохранить время модификации архива, которое он имел перед операцией

-tl

--timetolast

Установить время модификации архива на время модификации самого свежего файла в архиве

-fn

--fullnames

В командах d, e, x, t, l, v имена файлов, указанные в командной строке, относятся к файлам внутри архива. При этом возникает вопрос – обозначают ли они полное имя файла или только имя без имени каталога?  Ответ: если имя включает “/” или “\” или включена эта опция – то оно трактуется как полное имя

-k

--lock

Закрыть создаваемый архив от дальнейших изменений

-z

--arccmt

Добавить к архиву комментарий:

  • (по умолчанию) – комментарий копируется из исходного архива
  • -z- – комментарий удаляется при обновлении архива
  • -z – комментарий вводится с stdin
  • -zFILENAME – комментарий читается из заданного файла

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

 

--append

Добавлять новые файлы в конец архива (по умолчанию новые файлы вставляются в место, определяемое порядком сортировки, т.е. если в архиве есть файлы a.c и a.h, и в архив добавляется файл b.c, то он будет вставлен после a.c, но до a.h. Такой подход увеличивает степень сжатия при использовании солид-архивов)

 

--dirs

Добавить пустые каталоги в архив. Без указания этой опции, FreeArc добавляет пустые каталоги только в том случае, когда добавляются все файлы, т.е. явно или неявно указана маска “*”

-ed

--nodirs

Не добавлять пустые каталоги в архив

 

--cache

Задать размер кеша упреждающего чтения. Кеширование ускоряет архивацию большого кол-ва мелких файлов, когда большая часть времени работы архиватора приходится не на собственно упаковку,  а на то, чтобы прочитать все эти файлы с диска. По умолчанию используется кеш в 1 мб; опция “--cache” без параметров задаёт кеш в 16 мб. При распаковке кеширование не используется

 

--limitCompMem

Ограничить объём памяти, используемый алгоритмом упаковки. По умолчанию программа использует не более ¾ объёма физической памяти компьютера, но с помощью этой опции вы можете отменить ограничение или изменить его – см. Использование памяти

 

--limitDecompMem

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

 

--nodir

Не записывать в архив каталог сархивированных файлов. Эта опция полезна только для тестирования архиватора

 

--nodata

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

 

--crconly

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

 

--debug

Включить отладочную печать

 

--

Прекратить обработку опций. После указания “--“ далее в командной строке можно использовать любые имена файлов, в том числе и начинающиеся с “-“

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

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

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

Опции “-s” и “-m” имеют свой замысловатый формат, который описан в отдельных разделах.

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

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

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

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

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

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

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

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

-s16m

Создавать блоки размером в 16 мб. Правила задания размеров смотрите в разделе “Задание опций”

-s100

Создавать блоки, содержащие по 100  файлов

-se

Создавать отдельный блок для каждого расширения имени файлов

-s

Слить все файлы в один блок

-s-

Отключить солид-сжатие, т.е. создавать отдельный блок для каждого файла

По умолчанию сейчас используется “-s64m”. Возможно также применение двух или трёх критериев одновременно, например “-se10m100f” означает создавать блоки, содержащие файлы с одинаковым расширением, но не более 10 мб и не более 100 файлов в одном блоке.

 

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

-s100;

Блоки каталога по 100 файлов. Солид-блоки на все файлы в каждом блоке каталога

-s;

Один каталог и один солид-блок на весь архив

-s;100

Один каталог на весь архив, солид-блоки по 100 файлов

-s

Каталоги по 20 000 файлов, солид-блоки на все файлы внутри каждого блока каталога (вышеприведённое описание этой же опции “Слить все файлы в один блок” чуть-чуть неточно J)

По умолчанию сейчас используется “-s64m”, что эквивалентно “-s20000;64mJ

 

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

-s=7z

Эквивалентно “-s;”

-s=cab

Также эквивалентно “-s;”, но при этом отключает сжатие каталога архива, как это делает cabarc

-s=zip

Эквивалентно “-s;1”, т.е. каждый файл сжимается независимо от других, а блок каталога создаётся один общий на весь архив

-s=arj

Эквивалентно “-s1;1”, т.е. каждый файл сжимается независимо от других и тут же после него записывается блок каталога, описывающий этот файл

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

Для повышения степени сжатия при солид-упаковке файлы следует отсортировать так, чтобы файлы с похожим содержимым оказались близко друг к другу. Наилучшим способом сделать это является сортировка сначала по расширению, а затем по имени файла. Такую сортировку можно задать опцией “-ds=en”. Для ещё большего увеличения степени сжатия файлы сортируются в специальном порядке, заданном в файле arc.groups. В этом файле сгруппированы вместе многие однотипные файлы, например “*.c” и “*.h” (при сортировке непосредственно по расширениям между ними влезли бы файлы “*.exe”, да и не только они J). Для сортировки по группам, описанным в arc.groups, затем по расширениям и наконец по именам файлов можно было бы использовать опцию “-ds=gen”, да только она и так включена по умолчанию J. Сортировка по умолчанию отключается при отключении солид-сжатия (“-s-“), отключении упаковки (“-m0”), использовании fake-сжатия (--nodata и --crconly).

Если же вы хотите изменить порядок сортировки, то знайте, что “-ds” (без параметра) отключает её, а оставшиеся 718 способов сортировки можно задать, комбинируя после “-ds=” следующие буквы:

g

Сортировка по группам, описанным в файле arc.groups

e

Сортировка по расширению

n

Сортировка по имени файла

p

Сортировка по имени каталога

s

Сортировка по размеру

t

Сортировка по дате/времени файла

Например “-ds=ps” задаёт сортировку по имени каталога и размеру файла.

 

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

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

Опция “-m…”, задающая метод сжатия, имеет очень много возможностей. Мы рассмотрим их от простого к сложному. По умолчанию используется режим “-m3”. Опции “-m1/-m2” включают более быстрые режимы сжатия, приводящие к меньшей упаковке, а опции “-m4/-m5/-m6” – наоборот, увеличивают степень сжатия за счёт уменьшения скорости. Опции “-m1x”..”-m6x” позволяют создать архив, который можно распаковать быстро и используя небольшой объём памяти. Расплатой за это является меньшая скорость упаковки и степень сжатия, чем у соответствующих опций “-m1”..”-m6”. Примерное соотношение между различными режимами вы можете увидеть в нижеследующей таблице (тестирование производилось на машине Duron 1200 с 256 мб памяти на наборе данных из 1900 файлов общим объёмом 42 мб):

 

Степень сжатия

Скорость упаковки, kb/sec

Скорость распаковки, kb/sec

Память для упаковки

Память для распаковки

-m1

2.440

11.106

24.009

16 mb

16 mb

-m2

5.429

2.735

2.987

64 mb

64 mb

-m3

6.063

1.313

4.176

64 mb

64 mb

-m4

6.537

518

3.613

128 mb

128 mb

-m5

6.725

281

1.556

256 mb

256 mb

-m6

 

 

 

512 mb

512 mb

Режимы с быстрой распаковкой

-m1x

2.440

11.106

24.009

16 mb

16 mb

-m2x

4.807

2.116

11.228

16 mb

2 mb

-m3x

5.827

1.234

12.774

64 mb

8 mb

-m4x

6.428

447

13.131

128 mb

8 mb

-m5x

6.626

221

12.036

256 mb

16 mb

-m6x

 

 

 

512 mb

32 mb

 

Cледующая таблица сопоставляет режимы сжатия FreeArc c близкими по скорости/сжатию режимами других архиваторов:

FreeArc

PKZIP

ZIP

RAR

7-zip

UHARC

-m1

-es

-1

-m1

 

 

-m2

-ex

-9

-m2

-mx1

-mz

-m3

 

 

-m3

 

 

-m4

 

 

-m5

-mx5

-m1

-m5

 

 

 

-mx7

-m3

-m6

 

 

 

-mx9

-mx

 

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

 

Степень сжатия

Скорость упаковки, kb/sec

Скорость распаковки, kb/sec

Память для упаковки

Память для распаковки

RAR 3.42 (-md4096 -s)

-m1

4.228

4.778

21.989

32 mb

4 mb

-m2

5.463

1.434

25.769

32 mb

4 mb

-m3

5.829

1.037

23.736

32 mb

4 mb

-m5

6.035

706

3.732

64 mb

32 mb

7-zip 4.12

-mx1

4.870

2.230

12.429

8 mb

32 kb

-mx1 -md=21

5.707

1.422

14.206

16 mb

2 mb

-mx5

6.336

547

14.758

32 mb

2 mb

-mx7

6.664

246

15.187

128 mb

8 mb

UHARC 0.6 (-md32768)

-mz

5.645

2.648

2.464

32 mb

32 mb

-m1

6.393

427

3.423

256 mb

16 mb

-m2

6.539

305

3.533

256 mb

16 mb

-m3

6.626

250

3.557

256 mb

16 mb

-mx

7.163

281

356

64 mb

64 mb

Типы файлов

Режимы сжатия -m1..-m6 автоматически определяют тип файла по его расширению. Для этого используется информация из файла arc.groups. В нём указывается порядок файлов в архиве и кроме того, разбиение файлов по типам. После строчки с названием типа - $text, $exe, $compressed и т.д. – указываются маски файлов, принадлежащих этому типу. Так, например, содержимое файла arc.groups:

$text

readme.*

*.txt

*.doc

$binary

*.pdf

$default

$exe

*.exe

*.dll

означает что файлы readme.*, *.txt, *.doc имеют тип $text, файлы *.exe и *.dll – тип $exe, а файлы *.pdf и все оставшиеся (указанные как $default) – тип $binary. Тип файла используется для автоматического выбора наиболее подходящего для него алгоритма сжатия – файлы типа $text сжимаются алгоритмами -m1t..-m6t, а файлы остальных типов – алгоритмами -m1x..-m6x. Таким образом:

·     команда “Arc a archive -m5” означает “сжать текстовые файлы методом -m5t, а все остальные – методом -m5x

·     команда “Arc a archive” означает “сжать текстовые файлы методом -m3t, а все остальные – методом -m3x

·      и так далее...

Кроме того, при указании в командной строке опции “-ms” файлы типа $compressed сжимаются методом -m1x (это близко по скорости к -m0, но позволяет дополнительно немного поджать заголовки архивов). Остальные типы файлов будут использоваться в будущем по мере добавления в программу новых алгоритмов сжатия.

 

Вы можете явно указать программе, что данные нужно сжимать как текстовые или бинарные с помощью опций -m1t..-m6t и -m1x..-m6x, соответственно (методы -m1x..-m6x имеют двойное назначение – они одновременно оптимизированы и для быстрой распаковки, и для лучшего сжатия нетекстовых файлов). Так,

·      команда “Arc a archive fileware.doc -m3t” сожмёт файл fileware.doc как текстовый

·      а команда “Arc a archive fileware.doc -m3x” сожмёт его как бинарный.

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

 

В режимах –m1..-m6 архиватор автоматически подбирает метод сжатия для данных различных типов.

 

 

 

 

Типы данных определяются по именам файлов, в соответствии с описаниями в файле “arc.groups”. Так, описания:

$text

readme.*

*.txt

*.doc

$exe

*.exe

*.dll

обозначают, что файлы readme.*, *.txt и *.doc имеют тип $text, а файлы *.exe и *.dll – тип $exe.

 

В отличие от RAR, файл групп описывает не только порядок сортировки, но и типы файлов – текстовые, исполняемые и т.д. Для этого перед масками, описывающими файлы каждого типа, вставляется его обозначение – “$text”, “$exe”, “$rgb”, “$audio”, “$binary”, $compressed. Вот как это может выглядеть (цвета использованы только для удобства восприятия):

$text

readme.*

*.txt

*.doc

$binary

*.pdf

$default

$exe

*.exe

*.dll

*.lib

*.so

$audio

*.wav

Считывая такой файл групп, архиватор понимает, что файлы с расширениями “txt” и “doc” следует паковать алгоритмом, предназначенным для текстовых данных, а файлы с расширением “wav” – алгоритмом для аудио-файлов. Как FreeArc выбирает алгоритм сжатия для файлов каждого типа – описано в следующем разделе. 

Настройка параметров алгоритма сжатия

В свою очередь, методы -m1t..-m6t и -m1x..-m6x на самом деле являются сокращениями для режимов сжатия, наиболее оптимальных для достижения определённой скорости работы на данных соответствующих типов (текстов/бинарных данных). Они расшифровываются следующим образом:

 

Расшифровка

-m1t

lzp:8m:4:h13

-m2t

grzip:m4:8m:32:h15

-m3t

ppmd:10:48m

-m4t

ppmd:14:96m

-m5t

ppmd:18:160m:r

-m6t

ppmd:24:384m:r

Режимы с быстрой распаковкой

-m1x

lzp:8m:4:h13

-m2x

lzma:2m:fast:4

-m3x

lzma:8m:fast:32

-m4x

lzma:8m:normal:32

-m5x

lzma:16m:max:64

-m6x

lzma:32m:max:bt4b:128

 

Вы можете использовать эти методы с изменёнными значениями параметров, например:

Arc a archive –m2x:hc3:3

 

Вы также можете явно задать использование определённого алгоритма сжатия – lzma, ppmd, grzip и т.д.:

Arc a archive -m0=ppmd

или

Arc a archive -mppmd

При этом все архивируемые файлы будут сжаты алгоритмом PPMD c параметрами по умолчанию (запись в виде “-m0=…” позаимствована из 7-zip. “-m1=…” и прочее использовать нельзя J). Можно пойти дальше и указать дополнительные параметры алгоритма сжатия, перебивающие настройки по умолчанию. Они отделяются двоеточиями:

Arc a archive -m0=ppmd:o16:mem160m

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

Параметр и его значение по умолчанию

Описание

PPMD

o10

Порядок модели, т.е. количество символов, по которым осуществляется предсказание следующего символа. Может быть также указано без префикса: “-m0=ppmd:4

mem48mb

Объём памяти, используемой под модель. Также можно указывать в виде “m96mb” и даже “96mb”, т.е. с префиксом “m” или вовсе без префикса. О том, каким образом задаются объёмы памяти, см. раздел Задание опций  Error! Bookmark not defined.

r0

Режим обновления модели (0/1/2). “r” эквивалентно “r1”

LZMA

a1

Алгоритм поиска соответствий, “a0” – быстрый, “a1” – обычный, “a2” – максимального сжатия. Также может быть задан как “fast”, “normal” или “max”, соответственно, например “-m0=lzma:fast

d8mb

Максимальная дистанция поиска соответствий. Задаётся как объём памяти, см. раздел Задание опций  Error! Bookmark not defined.. Этот параметр можно указывать также без префикса: “-m0=lzma:4m

fb32

Минимальная длина найденного соответствия, после которого останавливается поиск более удачных (ещё более длинных соответствий). Уменьшение этого параметра способно значительно увеличить скорость упаковки за счёт уменьшения степени сжатия. Этот параметр можно указывать также без префикса: “-m0=lzma:4

lc3

Смысл этого параметра известен только Игорю Павлову, автору алгоритма LZMA J

lp0

-.-

pb2

-.-

mfBT4

Тип алгоритма поиска. После “mf” можно указать один из следующих типов: "bt2", "bt3", "bt4", "bt4b", "pat2", "pat2h", "pat3h", "pat4h", "pat2r", "hc3", "hc4". Подробное описание их особенностей можно найти в документации на 7-zip. Этот параметр можно указывать также без префикса: “-m0=lzma:hc4

GRZip

m1

Метод сжатия (m1 – BWT+WFC, m2 – BWT+MTF, m3 – ST4+WFC, m4 – ST4+MTF)

b8mb

Размер блока упаковываемых данных. Этот параметр можно указывать также без префикса: “-m0=grzip:4m

l32

Мин. длина соответствия, используемая при LZP-препроцессинге. Этот параметр можно указывать также без префикса: “-m0=grzip:64”. Для текстовых данных выгодней использовать значения чуть меньше, для бинарных – чуть больше, 32 – это некоторый вполне удачный компромисс

h15

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

s

Использовать альтернативный алгоритм сортировки в BWT-режиме. Практического значения не имеет

a

Использовать эвристический алгоритм для разбиения данных на блоки меньшего размера

l

Отключение использование LZP-препроцессора. На некоторых данных (например, на текстах книг) этот препроцессор не даёт заметного выигрыша в сжатии, но увеличивает время и упаковки, и распаковки

d

Включить эвристический препроцессор для мультимедийных данных

p

Отключить все препроцессоры (LZP, мультимедийный, разбиение данных на блоки меньшего размера). Следует заметить, что по умолчанию все они, окромя LZP, и так отключены, а LZP с таким же успехом отключается и опцией “-l”. Так что это скорее подстраховка на будущее, когда в алгоритм GRZip могут быть добавлены новые препроцессоры

LZP

 

Надо заметить, что алгоритм LZP – это тот же самый LZP-препроцессор из GRZip, только изящно соптимизированный Димой Шкариным. Посему его параметры полностью соответствуют параметрам LZP-препроцессора в алгоритме GRZip

b8mb

Размер блока упаковываемых данных. Этот параметр можно указывать также без префикса: “-m0=lzp:4m

l64

Мин. длина соответствия. Этот параметр можно указывать также без префикса: “-m0=lzp:16”. Для текстовых данных выгодней использовать значения чуть меньше, для бинарных – чуть больше, 64 – это некоторый вполне удачный компромисс

h18

Логарифм кол-ва элементов в хеш-таблице. Уменьшение этого параметра ускоряет упаковку и распаковку, но уменьшает степень сжатия, особенно на данных с большим кол-вом небольших повторяющихся строк, как например тексты. Для достижения максимального сжатия этот параметр можно увеличить, скажем, до 20

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

Если ¾ от физической памяти недостаточно для выбранного алгоритма сжатия, то программа автоматически уменьшает размер словаря/размера блока/... так, чтобы соответствовать «физическим кондициям» компьютера. Это ограничение можно снять с помощью опции “--limitCompMem-” или установить своё собственное ограничение на используемую при упаковке память, например “--limitCompMem=128mb”. Также можно установить ограничение на объём памяти, который потребуется для распаковки создаваемого архива, с помощью опции “--limitDecompMem”.

Опция “-md” устанавливает размер блока (для GRZIP/LZP) или словаря (для LZMA).

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

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

Цепочка алгоритмов упаковки

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

Arc a archive -m0=lzp,ppmd

В качестве препроцессоров имеет смысл использовать только алгоритм LZP с аккуратно подобранными настройками и алгоритм EXE, который не был упомянут выше – это препроцессор, улучшающий сжатие исполняемых файлов (EXE, DLL и других с 32-битным кодом, имеющих заголовок “MZ”). Вот ещё один пример применения нескольких алгоритмов – на этот раз для максимального сжатия исполняемых файлов:

Arc a archive -m0=lzp:32m:128:h20,exe,m6x 

Файлы, сжатые несколькими алгоритмами, в настоящее время не распаковываются SFX-модулем и Extractor’ом. Кроме того, последовательность алгоритмов сжатия нельзя применять для сжатия оглавления архива (в опции -dm)

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

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

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

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

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

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

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

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

·      любые другие ответы автоматически рассматриваются как проявление неуважения к программе J

 

Появление запросов на перезапись зависит от значения опции “-o”:

·      “-op” (значение опции по умолчанию) – выдавать запросы на перезапись

·      “-o+” – не выдавая запросы, перезаписывать все файлы (аналогично ответу “a”)

·      “-o-” – не выдавая запросы, пропускать все файлы (аналогично ответу “s”)

 

То, какие файлы программа будет предлагать перезаписать, также зависит от опций “-f” и “-u” (см. Список опций).

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

Размеры обрабатываемых файлов и самого архива ограничены 2^64 байт. Кол-во файлов в архиве ограничивается кол-вом доступной физической памяти на компьютере, где происходит его обработка. Информация об одном файле занимает порядка 1 кб. Если учесть, что память также требуется для алгоритмов (рас)паковки, операционной системы, программ и т.д., то на машине с 256 мб памяти можно работать с архивами, содержащими до 100-150 тысяч файлов. 

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

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

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

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

 

typedef int INOUT_FUNC(void *buf, int size);   // Объявлено в FreeArc.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) в свой код файл "../Environment/FreeArc.h" – в нём находятся все необходимые для связи с FreeArc определения. Желательно читать и записывать данные блоками по BUFFER_SIZE байт (эта константа также находится в FreeArc.h).

 

 

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