В один день мне стало неудобно использовать ^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]
^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)
Примечание: при повторной инициализации класса, в случае, если не указаны какие-то опции, используются значения предыдущей инициализации, если же таковой нет, то используются значения по умолчанию.
^Archive:create[имя файла;содержание] ^Archive:create[имя файла;содержание;архиватор] ^Archive:create[имя файла;содержание;архиватор;компрессор]
имя файла[string] имя файла с путем
содержание[string|table] имя архивируемого файла с путем или таблица (объект системного класса table) с одним столбцом path, содержащим архивируемые имена файлов и имена каталогов с путем (см. также «Домашний каталог и корень»)
архиватор[string] имя архиватора
компрессор[string] имя компрессора
^Archive:extract[имя файла] ^Archive:extract[имя файла;путь] ^Archive:extract[имя файла;путь;архиватор;компрессор]
Разархивирует архив в домашний каталог, либо в указанный каталог.
имя файла[string] имя файла с путем
путь[string] путь к каталогу для разархивирования (см. также «Домашний каталог и корень»)
архиватор[string] имя архиватора
компрессор[string] имя компрессора
^Archive:list[имя файла;архиватор;компрессор]
Формирует таблицу (объект системного класса table) с одним столбцом path, содержащим имена файлов и имена каталогов данного архива.
Примечание: при указании параметров ‘архиватор’ и ‘компрессор’, не зависимо от того, какое расширение имеет файл, будут использованы указанные программы (поддерживаемые классом).
Примечание: значения ‘архиватор’ и ‘компрессор’ можно получить лишь после того, как произойдет работа с архивом (создание, разархивирование и т.д.).
Предположим, нам нужен метод, который при указании ссылки на архив, находящийся на другом ресурсе, скачивал файл, сохранял его во временный каталог и разархивировал в нужный нам каталог на сервере.
@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[]