Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Добавление выбранных файлов в архив
Дальше: Разделение и объединение файлов архива

Распаковка файлов из архива

Рассмотрим пример распаковки файлов из архива с паролем, указанным пользователем. Данная задача может быть выполнена с помощью следующего программного кода (листинги 6.145, 6.146, 6.147, 6.148, 6.149).

Листинг 6.145. Пример распаковки файлов из ZIP-архива

&НаКлиенте

Процедура РаспаковкаФайловИзАрхива(Команда)

 

// Показать ввод пароля на архив

Подсказка = "Введите пароль на архив";

Оповещение = Новый ОписаниеОповещения("ПослеВводаСтроки", ЭтотОбъект);

ПоказатьВводСтроки(Оповещение, "", Подсказка, 0, Ложь);

 

КонецПроцедуры

Листинг 6.146. Процедура «ПослеВводаСтроки()»

&НаКлиенте

Процедура ПослеВводаСтроки(Пароль, Параметры) Экспорт

 

Если НЕ Пароль = Неопределено Тогда

ПоместитьФайлАрхива(Новый ОписаниеОповещения("РаспаковкаФайловИзАрхиваЗавершение", ЭтотОбъект, Пароль));

КонецЕсли;

 

КонецПроцедуры

Листинг 6.147. Процедура «ПоместитьФайлАрхива()»

&НаКлиенте

Процедура ПоместитьФайлАрхива(ОповещениеОЗавершении)

 

НачатьПомещениеФайлаНаСервер(ОповещениеОЗавершении, , , "", , УникальныйИдентификатор);

 

КонецПроцедуры

Листинг 6.148. Обработчик оповещения «РаспаковкаФайловИзАрхиваЗавершение()»

&НаКлиенте

Процедура РаспаковкаФайловИзАрхиваЗавершение(ОписаниеПомещенногоФайла, Пароль) Экспорт

 

Если ОписаниеПомещенногоФайла = Неопределено Тогда

Возврат;

КонецЕсли;

 

ОписаниеИзвлеченныхФайлов = РаспаковкаФайловИзАрхиваНаСервере(ОписаниеПомещенногоФайла.Адрес, Пароль);

 

Сообщение = Новый СообщениеПользователю();

ИзвлеченныеФайлы = Новый Массив;

 

Для Каждого Файл Из ОписаниеИзвлеченныхФайлов Цикл

ИзвлеченныеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.ИмяФайла, Файл.АдресФайла));

Сообщение.Текст = "Распаковывается файл: " + Файл.ИмяФайла;

Сообщение.Сообщить();

КонецЦикла;

 

ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов("Выберите каталог для сохранения файлов", Истина);

 

НачатьПолучениеФайловССервера(ИзвлеченныеФайлы, ПараметрыДиалога);

 

КонецПроцедуры

Листинг 6.149. Функция «РаспаковкаФайловИзАрхиваНаСервере()»

&НаСервереБезКонтекста

Функция РаспаковкаФайловИзАрхиваНаСервере(АдресФайлаАрхива, Пароль)

 

ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайлаАрхива);

 

МассивИзвлеченныхФайлов = Новый Массив();

ВременныйКаталог = КаталогВременныхФайлов();

 

Архив = Новый ЧтениеZipФайла(ДанныеФайла.ОткрытьПотокДляЧтения(), Пароль);

 

Для каждого Элемент из Архив.Элементы Цикл

 

Архив.Извлечь(Элемент, ВременныйКаталог,РежимВосстановленияПутейФайловZIP.НеВосстанавливать,

?(Элемент.Зашифрован, Пароль, ""));

 

ПолныйПутьКИзвлеченномуФайлу = ВременныйКаталог + Элемент.Имя;

АдресИзвлеченногоФайла = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПолныйПутьКИзвлеченномуФайлу));

 

ДанныеИзвлеченногоФайла = Новый Структура("АдресФайла, ИмяФайла",);

ДанныеИзвлеченногоФайла.АдресФайла = АдресИзвлеченногоФайла;

ДанныеИзвлеченногоФайла.ИмяФайла = Элемент.Имя;

 

МассивИзвлеченныхФайлов.Добавить(ДанныеИзвлеченногоФайла);

 

УдалитьФайлы(ПолныйПутьКИзвлеченномуФайлу);

 

КонецЦикла;

 

Архив.Закрыть();

 

Возврат МассивИзвлеченныхФайлов;

 

КонецФункции

Сначала пользователю показывается диалог с запросом пароля на чтение архива. Затем пользователю предлагается выбрать файл архива, и начинается помещение выбранного файла на сервер. Когда файл помещен, вызывается функция РаспаковкаФайловИзАрхиваНаСервере(), в которую передаются адрес помещенного файла и введенный пользователем пароль.

В этой функции данные файла-архива получаются из временного хранилища и с помощью метода ОткрытьПотокДляЧтения() поток двоичных данных открывается для чтения. Затем на основе этого потока создается объект ЧтениеZipФайла.

После этого элементы архива обходятся в цикле, каждый файл извлекается из архива во временный каталог методом Извлечь(). На каждом шаге цикла заполняется массив структур, содержащих адреса во временном хранилище и имена извлеченных из архива файлов. Этот массив МассивИзвлеченныхФайлов функция возвращает в процедуру РаспаковкаФайловИзАрхиваЗавершение(), в которой переданные разархивированные файлы получаются на клиенте согласно их описаниям.

Назад: Добавление выбранных файлов в архив
Дальше: Разделение и объединение файлов архива