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