Файловая работа с архивами
Для работы с 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рхив.ИзвлечьВсе(МестоНазначения)
;