Перейти к основному содержимому

Файловая работа с архивами

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

Изменение архива

ФайлZip имеет несколько методов для изменения архива:

  • Добавить(Строка | Файл) — добавляет в архив файл (по его пути или сам файл). Если путь указывает на каталог, добавляет каталог и его содержимое.
  • Добавить(ПотокЧтения) — добавляет в архив содержимое потока.
  • Удалить() — удаляет из архива файл или каталог со всем его содержимым.
  • УстановитьКомментарий() — устанавливает комментарий к архиву.
  • ПолучитьКомментарий() — возвращает комментарий к архиву.

Пример добавления файлов в ZIP-архив

метод ЗаписатьСШифрованием()
// Создадим экземпляр ФайлZip для работы с архивом.
// Благодаря паролю можно распаковывать файлы, если архив уже существует и файлы зашифрованы, а также добавлять
// новые файлы в зашифрованном виде. Метод шифрования по умолчанию — МетодШифрованияZip.Zip20
пер Архив = новый ФайлZip(Файлы.ПолучитьДомашнийКаталог().Путь + "/archive.zip", "password")

// Для новых файлов установим максимальный уровень сжатия, иначе значение будет Нормальный
пер УровеньСжатияПоУмолчанию = УровеньСжатияZip.Максимальный

// Для новых файлов установим метод шифрования (так как открыли архив с паролем),
// иначе значение будет Zip20
пер МетодШифрованияПоУмолчанию = МетодШифрованияZip.Aes256

// Добавим папку с файлами
Архив.Добавить(Файлы.ПолучитьДомашнийКаталог().Путь + "/ПапкаСФайламиДляСжатия",
УровеньСжатия = УровеньСжатияПоУмолчанию, МетодШифрования = МетодШифрованияПоУмолчанию)

пер ФайлДляСжатия = новый Файл("ФайлДляСжатия.txt",
Файлы.ПолучитьДомашнийКаталог())

// Добавим файл в корень архива
Архив.Добавить(ФайлДляСжатия, УровеньСжатия = УровеньСжатияПоУмолчанию,
МетодШифрования = МетодШифрованияПоУмолчанию)

// Можем также добавить файл через поток
Архив.Добавить(ФайлДляСжатия.ОткрытьПотокЧтения(), "ПапкаСФайламиДляСжатия/ФайлДляСжатия_Копия",
УровеньСжатия = УровеньСжатияПоУмолчанию, МетодШифрования = МетодШифрованияПоУмолчанию)
Архив.УстановитьКомментарий("Архив с ПапкаСФайламиДляСжатия и файлом. Сделана копия. Пароль: password")

// Закрывать Архив не нужно, все изменения сразу сохраняются на диск.
;

Пример поиска и перезаписи файла в архиве

метод НайтиИПереписатьФайл(ПутьКАрхиву: Строка, ИмяФайла: Строка, НовыеДанные: ПотокЧтения)
пер Архив = новый ФайлZip(ПутьКАрхиву)

// Попробуем найти файл, который надо перезаписать, по имени
пер Элементы = Архив.Найти(ИмяФайла)
если Элементы.Размер() > 1
// Если найдено несколько файлов с таким именем, выбросим исключение
выбросить новый ИсключениеНедопустимыйАргумент("Найдено несколько файлов с таким именем. Уточните путь к искомому файлу.")
;

пер ИскомыйЭлемент = Элементы.Получить(0)
пер ПутьКЭлементуВАрхиве = ИскомыйЭлемент.ПутьВАрхиве

// Заменяем файл
Архив.Удалить(ИскомыйЭлемент)
Архив.Добавить(НовыеДанные, ПутьКЭлементуВАрхиве, УровеньСжатияZip.Максимальный)
;

Распаковка архива

ФайлZip поддерживает следующие методы для чтения содержимого архива:

  • ИзвлечьВсе(Строка | Файл)) — распаковывает весь архив в указанный каталог.
  • Извлечь(ЭлементZip | Строка) — распаковывает элемент архива в указанный каталог.
  • Найти() — ищет все элементы архива по указанной подстроке, содержащейся в пути.
  • ЕстьЗашифрованныеФайлы() — возвращает Истина, если хотя бы один элемент архива зашифрован.
  • Элементы() — возвращает все элементы архива.

Если имена файлов внутри архива сохранены не в кодировке UTF-8, вы можете указать нужную кодировку, используя параметр КодировкаИменФайлов конструктора ФайлZip. Это позволит вам избежать появления нечитаемых символов в именах файлов и путей к ним при распаковке архива.

Подробнее о поддерживаемых кодировках

Пример извлечения файлов из архива

метод РаспаковатьАрхив(Путь: Строка)
// Создадим экземпляр ФайлZip для работы с архивом.
// Если архив зашифрован, укажите пароль для распаковки архива.
// Укажите кодировку имен файлов в архиве, если она отлична от UTF-8.
пер Aрхив = новый ФайлZip(Путь, "password", Кодировка.Windows1251)

пер МестоНазначения = Файлы.ПолучитьДомашнийКаталог().Путь + "\\Documents"

// Извлечем один файл
Aрхив.Извлечь("ИмяФайла", МестоНазначения)

// Извлечем все файлы
Aрхив.ИзвлечьВсе(МестоНазначения)
;