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

Разделение и объединение файлов архива

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

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

Листинг 6.150. Пример разделения ZIP-архива

&НаКлиенте

Процедура РазделитьФайлыАрхива(Команда)

 

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

 

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

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

&НаКлиенте

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

 

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

Возврат;

КонецЕсли;

 

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

МассивДанныхЧастей = РазделитьДвоичныеДанные(ДанныеФайлаАрхива, 1024 * 1024);

 

МассивЧастичныхФайлов = Новый Массив;

 

Индекс = 0;

Для Каждого ДанныеЧасти Из МассивДанныхЧастей Цикл

 

АдресФайла = ПоместитьВоВременноеХранилище(ДанныеЧасти);

ИмяФайла = ОписаниеПомещенногоФайла.СсылкаНаФайл.Имя + "_" + СокрЛП(Строка(Индекс));

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

Индекс = Индекс + 1;

 

КонецЦикла;

 

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

 

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

 

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

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

После этого в цикле обхода получившегося массива двоичных данных на основе адреса во временном хранилище и имени каждой части создается массив описаний передаваемых файлов, согласно которому файлы частей сохраняются в выбранный пользователем каталог локальной файловой системы. Имя файла части формируется на основе имени файла архива с добавлением постфикса с порядковым номером части.

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

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

Листинг 6.152. Пример объединения файлов из ZIP-архива

&НаКлиенте

Процедура ОбъединитьФайлыАрхива(Команда)

 

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

 

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

Листинг 6.153. Обработчик оповещения «ОбъединитьФайлыАрхиваЗавершение()»

&НаКлиенте

Процедура ОбъединитьФайлыАрхиваЗавершение(ПомещенныеФайлы, Дополнительно) Экспорт

 

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

Возврат;

КонецЕсли;

 

ДанныеОбъединяемыхФайлов = Новый Массив;

 

Для Каждого ЧастичныйФайл Из ПомещенныеФайлы Цикл

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

КонецЦикла;

 

ОбъединенныеДанные = СоединитьДвоичныеДанные(ДанныеОбъединяемыхФайлов);

АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ОбъединенныеДанные);

НачатьПолучениеФайлаССервера(, АдресФайлаВХранилище, "c:\temp\pict.zip");/

 

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

Сначала пользователю показывается диалог множественного выбора частичных файлов архива, которые требуется объединить, и начинается помещение выбранных файлов на сервер. Когда все файлы помещены, данные частичных файлов получаются из временного хранилища и добавляются в массив ДанныеОбъединяемыхФайлов.

На основе этого массива с помощью метода СоединитьДвоичныеДанные() двоичные данные объединяются, помещаются во временное хранилище и затем сохраняются в локальную файловую систему в виде целого zip-архива.

Процедура ПоместитьФайлыВАрхив() была приведена в листинге 6.142.

Назад: Распаковка файлов из архива
Дальше: DBF-файлы