9. ОПЕРАЦИИ С АРХИВАМИ ФАЙЛОВ

Архивом файлов называется файл, который в сжатом закодированном виде сохраняет содержание нескольких файлов, включая их названия и распределение по папкам. Такой файл, грубо говоря, представляет собой образ дискеты или части диска. Часто удобно архивировать даже один файл с целью уменьшить его объем. Архивы файлов очень широко используются для передачи информации по различным каналам. Существует много готовых программ, которые создают архивы и выполняют операции с архивами. В языке программирования Java в качестве базового алгоритма сжатия и архивирования выбран zip. Соотвественно в языке ACL также реализована команда #zip, работающая с zip-архивами. Имя команды можно сократить до #z. Эта команда имеет 5 операций, каждая из которых имеет свою область применимости. Ниже последовательно рассмотрены эти операции. Минимальное число символов в имени операции равно 3.

.

 #z [op=cat; file=;]

Эта операция позволяет программисту получить список файлов внутри рассматриваемого zip-архива. Полный список файлов возвращается в текстовый массив t(), начальный элемент которого задается, как обычно, параметром s(3). После операции s(4) и s(5) показывают начало и длину произведенной записи. Имена файлов внутри строки разделяются символом вертикальной черты [ | ]. Нужно помнить, что в каталоге файлы внутри папок имеют сложные имена типа (folder/file), и, кроме того, есть имена типа (folder/) которые указывают на наличие самих папок. Имя файла архива определяет параметр [file], причем нужно задавать полное имя относительно интерпретатора, включая расширение. Однако расширение файла не обязательно должно иметь вид .zip и может быть любым или вовсе отсутствовать. Это касается и всех других операций.

.

 #z [op=sfo; file=; n=;] FT FT . . .

Эта операция позволяет программисту создать новый zip-файл, имя которого будет определяться параметром [file] и который будет содержать все файлы внутри указанных папок. Число папок задается параметром [n], а имена папок являются аргументами со структурой FT (форматированной строки). Все имена отсчитываются от главной папки интерпретатора, то есть рабочая папка не используется.

.

 #z [op=gfo; file=; n=; mo=;] FT FT . . .

Эта операция является обратной предыдущей. Она позволяет вынуть из zip-архива все файлы из указанных папок. Структура параметров и аргументов та же, что и у предыдущей операции. Однако здесь есть дополнительный параметр [mo]. Если [mo=0;], то вынутые папки будут добавлены к существующим папкам или будут созданы новые папки, если они не существовали. Существующие файлы с теми же именами будут заменены на новые. И все новые файлы останутся на месте после окончания работы интерпретатора. Если [mo=1;], то вынутые файлы будут уничтожены после окончания работы интерпретатора. В этом случае вынутые файлы живут только в течение времени, когда живет сама программа интерпретатора (но не ACL программы). Наконец, если [mo=2;], то вынимание файлов из архива будет происходить только в том случае, если вынимаемые папки отсутствуют. Более точно, будут созданы только такие папки, которых не было ранее. И после работы интерпретатора эти папки будут существовать. Поэтому программа может вынуть такие папки только один раз. Этот режим удобен для организации дистрибутива. Важное дополнительное замечание. Если папки вложены друг в друга, например, "one/two/...", то прежде чем вынимать внутреннюю папку, надо сначала вынуть внешнюю папку. Внутренняя папка вынимается только в том случае, если внешняя уже существует. Конкретно, надо сначала вынуть папку "one". При этом будут вынуты все файлы из этой папки, но не внутренние папки. И затем еще одной командой нужно вынимать папку "one/two".

.

 #z [op=sfi; file=; n=;] FT FT . . .

Эта операция позволяет создать новый zip-файл с именем, задаваемым параметром [file], и содержанием в виде всех файлов, указанных как аргументы. Если имя некоторого файла имеет структуру "folder/file", то будет создана новая папка внутри zip-архива. Эта команда является более общей по сравнению с [op=sfo;] но программисту необходимо сформировать длинный список имен, содержащих все файлы. Зато она удобна для архивирования со сжатием одного большого файла.

.

 #z [op=gfi; file=; n=; mo=;] FT FT . . .

Эта операция позволяет программисту вынуть все файлы, указанные как аргументы. Файлы внутри папок должны иметь имена типа "folder/file". Параметр [mod] имеет тот же самый смысл, как и в операции [op=gfo;]. Аналогично предыдущей команде, вынимаются файлы только из последней внутренней папки (при этом она создается), а внешние папки должны существовать или быть созданы заранее.