Archive. Класс для работы с архивами.

В один день мне стало неудобно использовать ^file::cgi[…] для работы с архивами и я написал класс, помогающий мне работать с ними.

Класс поддерживает архиваторы tar (+ компрессоры: gzip и bzip2), zip и rar. Класс используется статически, т.е. нет необходимости в создании объектов с помощью конструкторов.

Домашний каталог и корень.

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

«Корень» — корень веб-пространства ($request:document-root).

Примеры:

В каталоге из которого запущен скрипт Парсера, будет создан архив, содержащий файл из этого же каталога:

^Archive:create[db_dump.zip;db_dump-${dtNow.year}${dtNow.month}${dtNow.day}.sql]

Архив, расположенный в корне, будет разархивирован в каталог texts, находящийся на 2 ступени выше относительно домашнего каталога (в данном случае он равен корню):

^Archive:extract[/my_texts.rar;../../texts]

Статистические методы.

init — инициализация статистического класса

^Archive:init[
	$.SCRIPT_PATH[путь к скрипту]
	$.DEBUG_OBJECT[объект debug-класса]
]

Опции:

$.SCRIPT_PATH[string] — путь к консольному скрипту (archive.sh — BASH / archive.bat — MS-DOS)
$.DEBUG_OBJECT[object] — объект debug-класса, совместимый с классом Debug (P3 XML Debugger)

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

create — создание архива

^Archive:create[имя файла;содержание]
^Archive:create[имя файла;содержание;архиватор]
^Archive:create[имя файла;содержание;архиватор;компрессор]

имя файла[string] — имя файла с путем
содержание[string|table] — имя архивируемого файла с путем или таблица (объект системного класса table) с одним столбцом path, содержащим архивируемые имена файлов и имена каталогов с путем (см. также «Домашний каталог и корень»)
архиватор[string] — имя архиватора
компрессор[string] — имя компрессора

extract — разархивирование архива

^Archive:extract[имя файла]
^Archive:extract[имя файла;путь]
^Archive:extract[имя файла;путь;архиватор;компрессор]

Разархивирует архив в домашний каталог, либо в указанный каталог.

имя файла[string] — имя файла с путем
путь[string] — путь к каталогу для разархивирования (см. также «Домашний каталог и корень»)
архиватор[string] — имя архиватора
компрессор[string] — имя компрессора

list — получение содержания архива

^Archive:list[имя файла;архиватор;компрессор]

Формирует таблицу (объект системного класса table) с одним столбцом path, содержащим имена файлов и имена каталогов данного архива.

Примечание: при указании параметров ‘архиватор’ и ‘компрессор’, не зависимо от того, какое расширение имеет файл, будут использованы указанные программы (поддерживаемые классом).

Статистические поля.

SCRIPT_PATH[string] — получение имени файла консольного скрипта

ARCHIVER[string] — получение имени архиватора

COMPRESSOR[string] — получение имени компрессора

Примечание: значения ‘архиватор’ и ‘компрессор’ можно получить лишь после того, как произойдет работа с архивом (создание, разархивирование и т.д.).

Примеры использования.

Загрузка и разархивирование архива с другого веб-ресурса.

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

@extractWebArchive[strURL;strTmpDir;strDirTo][sTmpDir;fArchive]
^if(!def $strURL){
	^throw[CLASS_NAME.spec;^$strURL;param not specified]
}

^if(def $strTmpDir){
	$sTmpDir[$strTmpDir]
}{
	$sTmpDir[/../data/tmp]
}

^if(^strURL.left(4) ne 'http'){
	^throw[CLASS_NAME.url.type;^$strURL;unknown url type]
}

$fArchive[^file::load[$strURL]]
^fArchive.save[binary;$sTmpDir]

^Archive:extract[$sTmpDir/$fArchive.name;$strDirTo]

$result[]
#end @extractWebArchive[]