Особенности работы с ZIP-объектами

Платформа 1С:Предприятие предоставляет возможности работы с ZIP архивами. Для этого в системе существуют объекты ЗаписьZIPФайла, ответственный за запись, и ЧтениеZIPФайла, соответственно ответственный за чтение архивов.

Создание ZIP-архивов

Для того чтобы записать файлы в ZIP-архив необходимо выполнить несколько простых действий:

Рассмотрим эти действия подробнее.

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

Для создания нового архива требуется указать:

  1. Имя файла, куда будет записан архив. Этот параметр является обязательным. Если такой файл уже существует на диске, он будет перезаписан!
  2. Пароль доступа к архиву. Если этот параметр пропущен или равен пустой строке, то шифрование производится не будет!
  3. Комментарий к архиву.
  4. Метод сжатия файлов в архиве. На выбор предоставляется возможность скопировать файлы в архив без сжатия или сжать их. По умолчанию файлы сжимаются.
  5. Уровень сжатия файлов в архиве. Можно выбирать между минимальным, оптимальным и максимальным сжатием. По умолчанию используется оптимальное сжатие
  6. Метод шифрования. Можно защитить архив методом шифрования ZIP 2.0, совместимым с большинством программ, или с помощью шифрования на основе новейшего стандарта AES с различной длиной ключа (128, 192 и 256 бит). Однако следует помнить, что данный метод может быть не совместим с некоторыми программами архивирования, например WinRAR.

После создания объекта необходимо добавить в него необходимые файлы, воспользовавшись методом Добавить. Он принимает на вход 3 параметра:

  1. Полное имя файла или маску.
  2. Режим сохранения путей к файлу. Можно сохранять полные пути, не сохранять пути совсем или сохранять пути относительно каталога.
  3. Режим обработки подкаталогов. Можно обрабатывать подкаталоги рекурсивно или не обрабатывать их. Параметр имеет смысл, если в качестве имени указана маска.

После того, как все необходимые файлы добавлены, можно записать архив на диск, воспользовавшись методом Записать().

 Важно понимать, что до выполнения этого метода, никаких реальных действий по созданию архива не происходит. После записи архива на диск объект закрывает его и для работы со следующим архивом необходимо выполнить метод Открыть().

Пример:

Копировать в буфер обмена
Сейчас = ТекущаяДата();

// Создадим объект записи ZIP-архива
ЗаписьZIP = Новый ЗаписьZipФайла(ИмяАрхивногоФайла,
				ПарольАрхивногоФайла,
				"" + МетодСжатия + Символы.ПС + УровеньСжатия + Символы.ПС + МетодШифрования,
				МетодСжатия,
				УровеньСжатия,
				МетодШифрования);

// Добавим необходимые файлы в архив
ЗаписьZIP.Добавить("c:\MyFiles\File1.xml", РежимСохраненияПутейZIP.НеСохранятьПути);
ЗаписьZIP.Добавить("c:\MyFiles\MoreFiles\*.xml", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать);

// Запишем архив на диск
ЗаписьZIP.Записать();

// Сообщим время, которое потребовалось для работы.
Сообщить("Упаковка заняла " + ТекущаяДата() - Сейчас) + " секунд(ы)");

Особенности упаковки файлов по маске

Остановимся подробнее на особенностях упаковки файлов по маске.

Предположим, что у нас есть следующий файлы, которые нам необходимо поместить в архив:

Копировать в буфер обмена
c:\ZipTest\11.xls
c:\ZipTest\12.xls
c:\ZipTest\13.xls
c:\ZipTest\MoreFiles\14.xls
c:\ZipTest\MoreFiles\15.xls
c:\ZipTest\MoreFiles\16.xls

Пример 1

Мы хотим создать в архив с помощью нижеследующих команд:

Копировать в буфер обмена
// Добавим необходимые файлы в архив
ЗаписьZIP.Добавить("c:\ZipTest\11.xls", РежимСохраненияПутейZIP.СохранятьПолныеПути);
ЗаписьZIP.Добавить("c:\ZipTest\12.xls", РежимСохраненияПутейZIP.СохранятьОтносительныеПути);
ЗаписьZIP.Добавить("c:\ZipTest\13.xls", РежимСохраненияПутейZIP.НеСохранятьПути);

В результирующий архив будут помещены следующие файлы:

Копировать в буфер обмена
\ZipTest\11.xls
\12.xls
\13.xls

Пример 2

Мы хотим создать в архив с помощью нижеследующих команд:

Копировать в буфер обмена
// Добавим необходимые файлы в архив
ЗаписьZIP.Добавить("c:\ZipTest\*.xls", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать);

В результирующий архив будут помещены следующие файлы:

Копировать в буфер обмена
\ZipTest\11.xls
\ZipTest\12.xls
\ZipTest\13.xls

Пример 3

Мы хотим создать в архив с помощью нижеследующих команд:

Копировать в буфер обмена
// Добавим необходимые файлы в архив
ЗаписьZIP.Добавить("c:\ZipTest\*.xls", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);

В результирующий архив будут помещены следующие файлы:

Копировать в буфер обмена
\ZipTest\11.xls
\ZipTest\12.xls
\ZipTest\13.xls
\ZipTest\MoreFiles\14.xls
\ZipTest\MoreFiles\15.xls
\ZipTest\MoreFiles\16.xls

Чтение ZIP-архивов

Для того чтобы прочитать файлы из ZIP-архива необходимо выполнить несколько простых действий:

Рассмотрим эти действия подробнее.

Создание объекта ЧтениеZIPФайла можно осуществить двумя путями - создать инициализированный объект или создав неинициализированный объект вызвать у него метод Открыть(). В обоих случаях состав параметров является одинаковым. В самом простом случае требуется указать только имя архивного файла, с которым необходимо работать.

Для открытия архива требуется указать:

  1. Имя файла, который требуется открыть. Этот параметр является обязательным.
  2. Пароль доступа к архиву.

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

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

После получения информации о элементах их можно распаковать на диск. Это возможно сделать двумя методами:

Метод ИзвлечьВсе() распаковывает все файлы в архиву по указанному пути. Второй параметр данного метода определяет возможность восстановления исходных путей файлов.

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

После того, как архив нам больше не нужен можно завершить работу с ним вызвав метод Закрыть().

Пример:

Копировать в буфер обмена
Сообщить("Распаковка файла - " + ИмяАрхивногоФайла);
Сейчас = ТекущаяДата();

// Откроем файл для чтения
ЧтениеZIP = Новый ЧтениеZipФайла(ИмяАрхивногоФайла,
				ПарольАрхивногоФайла);

// Сообщим комментарий архива
Сообщить("Комментарий:");
Сообщить(ЧтениеZIP.Комментарий);

// Распакуем все файлы из архива
ЧтениеZIP.ИзвлечьВсе(ПапкаНазначения, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);

// Распакуем файлы по одиночке
Для Каждого Элемент Из ЧтениеZIP.Элементы Цикл
	Сообщить("Распаковка файла:" + Элемент.ПолноеИмя);
	ЧтениеZIP.Извлечь(Элемент,
			ПапкаНазначения,
			РежимВосстановленияПутейФайловZIP.Восстанавливать, 
			? (Элемент.Зашифрован, ПарольАрхивногоФайла, ""));
КонецЦикла;

ЧтениеZIP.Закрыть();

// Сообщим время, потребовавшееся для работы
Сообщить("Распаковка заняла " + (ТекущаяДата() - Сейчас) + " секунд(ы)");

Дополнительные возможности

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

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

Функция РазделитьФайл() предназначена для разбиения файла на несколько частей указанного размера. Функция ОбъединитьФайлы()  объединяет несколько файлов в один.

Более подробную информацию о этих функциях можно получить в документации.