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