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