Потоковая работа с архивами

Для записи архива используется тип ЗаписьZip. Архив будет записываться в какой-либо поток, предназначенный для записи. Такой поток, например, можно получить из значения типа Файл следующим образом: Файл.ОткрытьПотокЗаписи(). Также для архива можно указать пароль, уровень сжатия и комментарий.

Для добавления файла в создаваемый архив предназначен метод Добавить() типа ЗаписьZip. При добавлении файла в архив следует помнить о том, как в архиве формируется иерархия файлов. Параметр ПутьВАрхиве метода Добавить() позволяет указать путь к добавляемому файлу. Если указать в этом параметре полный путь к добавляемому файлу — в архиве будет сохранен именно он. Если требуется указать относительный путь к файлу — необходимо самостоятельно удалить фрагмент пути от корня файловой системы до нужного уровня.

Далее будет приведен пример добавления в архив всех файлов с расширением .xml в каталоге Documents домашнего каталога текущего пользователя (с обходом всех подкаталогов). Файлы будут сохраняться в архиве по относительным путям. Корневым каталогом архива будет каталог Documents.

метод Скрипт()
    пер Источник = новый Файл(Файлы.ПолучитьДомашнийКаталог().Путь + "\\Documents")
    пер ИмяАрхива = новый Файл(Источник.Путь + "\\xml-files.zip")
    пер Писатель = новый ЗаписьZip(ИмяАрхива.ОткрытьПотокЗаписи())
    для Файл из Источник.Дочерние
    	ДобавитьРекурсивно(Писатель, Файл, ИмяАрхива.Каталог.Путь)
    ;
    Писатель.Записать()
    Консоль.Записать("Архивация завершена.")
;
    		
метод ДобавитьРекурсивно(ПотокАрхива: ЗаписьZip, Источник: Файл, КорневойКаталог: Строка)
    если Источник.ЯвляетсяФайлом() и Источник.Расширение == "xml"
    	ПотокАрхива.Добавить(Источник.ОткрытьПотокЧтения(), Источник.Путь.Заменить(КорневойКаталог, ""))
    ;
    для Файл из Источник.Дочерние
    	ДобавитьРекурсивно(ПотокАрхива, Файл, КорневойКаталог)
    ;
;

В данном примере формирование относительного пути в архиве происходит при выполнении следующей операции: Источник.Путь.Заменить(КорневойКаталог, "").

Для чтения ZIP-архива используется тип ЧтениеZip. Общая схема работы с данным типом подобна записи архива: для файла с архивом получается поток чтения; затем создается экземпляр ЧтениеZip, который читает данные из потока чтения; затем происходит получение содержимого архива.

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

Следующий пример ищет в каталоге (который задается переменной ГдеИщем) все ZIP-архивы и выводит в консоль список файлов для каждого найденного архива.

метод Скрипт()
    пер ГдеИщем = "<путь к каталогу с zip-файлами>"
    пер СписокФайлов = Файлы.Найти(ГдеИщем, новый НастройкиПоискаФайлов().ИмяСодержит(".zip"))
    для Файл из СписокФайлов
    	пер Архив = новый ЧтениеZip(Файл.ОткрытьПотокЧтения())
    	Консоль.Записать("ZIP-файл: " + Файл.Имя)
    	пока Архив.Следующий()
    		пер Элемент = Архив.ПолучитьЭлемент()
    		Консоль.Записать("\tэлемент: " +  Элемент.ПутьВАрхиве + (Элемент.ЯвляетсяКаталогом() ? " (каталог)" : ""))
    	;
    ;
;