Файловая работа с архивами
Для работы с ZIP-архивом как файлом предназначен тип ФайлZip . Вы можете получить экземпляр этого типа с помощью конструктора, которому в качестве параметра нужно передать путь к будущему файлу архива. Закрывать экземпляр не надо, все изменения архива сразу отображаются на диск.
ФайлZip имеет несколько методов для изменения архива:
- Добавить(Строка | Файл) — добавляет в архив файл (по его пути или сам файл). Если путь указывает на каталог, добавляет каталог и его содержимое.
- Добавить(ПотокЧтения) — добавляет в архив содержимое потока.
- Удалить() — удаляет из архива файл или каталог со всем его содержимым.
- УстановитьКомментарий() — устанавливает комментарий к архиву.
- ПолучитьКомментарий() — возвращает комментарий к архиву.
Кроме того, ФайлZip имеет методы для чтения архива:
- Извлечь(Строка | Файл) — распаковывает весь архив в указанный каталог.
- Извлечь(ЭлементZip | Строка) — распаковывает элемент архива в указанный каталог.
- Найти() — ищет все элементы архива по указанной подстроке, содержащейся в пути.
- ЕстьЗашифрованныеФайлы() — возвращает Истина, если хотя бы один файл-элемент зашифрован.
- Элементы() — возвращает все элементы архива.
Пример записи в ZIP-архив:
метод ЗаписатьСШифрованием()
// Создать экземпляр взаимодействия с архивом
пер Архив = новый ФайлZip(Файлы.ПолучитьДомашнийКаталог().Путь + "/archive.zip", "password")
// Благодаря паролю можно распаковывать файлы, если архив уже существует и файлы зашифрованы, а также добавлять
// новые файлы в зашифрованном виде МетодШифрованияПоУмолчанию = МетодШифрованияZip.Zip20
// Для новых файлов установим максимальный уровень сжатия, иначе значение будет Нормальный
пер УровеньСжатияПоУмолчанию = УровеньСжатияZip.Максимальный
// Для новых файлов установим метод шифрования, иначе значение будет Zip20 (так как открыли архив с паролем)
пер МетодШифрованияПоУмолчанию = МетодШифрованияZip.AES256
// Добавим папку с файлами
Архив.Добавить(Файлы.ПолучитьДомашнийКаталог().Путь + "/ПапкаСФайламиДляСжатия",
УровеньСжатияПоУмолчанию, МетодШифрованияПоУмолчанию)
пер ФайлДляСжатия = новый Файл("ФайлДляСжатия.txt",
Файлы.ПолучитьДомашнийКаталог())
// Добавим в корень файл
Архив.Добавить(ФайлДляСжатия, УровеньСжатияПоУмолчанию, МетодШифрованияПоУмолчанию);
// Можем добавить через поток
Архив.ДобавитьИзПотока(ФайлДляСжатия.ОткрытьПотокЧтения(), "ПапкаСФайламиДляСжатия/ФайлДляСжатия_Копия",
УровеньСжатияПоУмолчанию, МетодШифрованияПоУмолчанию)
Архив.Комментарий = "Архив с ПапкаСФайламиДляСжатия и файлом. Сделана копия. Пароль: password"
// Закрывать Архив или сохранять изменения не нужно. Все команды работают сразу.
;
Пример распаковки зашифрованного
архива:
// Допустим, мы не знаем, является архив зашифрованным или нет.
// В таком случае мы все равно сможем посмотреть его элементы без их содержимого. Воспользуемся этим
метод ИзвлечьНеизвестныйАрхив(Путь: Строка)
// Не знаем, изначально файлы архива зашифрованы или нет.
пер ПроверочныйАрхив = новый ФайлZip(Путь)
пер АрхивДляРаботы = Неопределено
если ПроверочныйАрхив.Зашифрован()
// Создать новый экземпляр с паролем для возможности распаковки содержимого.
АрхивДляРаботы = новый ФайлZip(Путь, "possible_password")
иначе
АрхивДляРаботы = ПроверочныйАрхив
;
// Аналог: получаем все элементы (.Элементы()),
// если не Элемент.ЯвляетсяКаталогом() смотрим на Элемнет.Зашифрован() (см. описание типа)
АрхивДляРаботы.ИзвлечьВсе(Файлы.ПолучитьДомашнийКаталог().Путь)
// Если нужен один файл.
АрхивДляРаботы.Извелчь("ВыбранныйФайл.txt", Файлы.ПолучитьДомашнийКаталог().Путь)
;
// Если мы не знаем, зашифрован архив или нет, то можно создать экземпляр ZipФайл с паролем в конструкторе.
// Так для обычных и зашифрованных элементов распаковка пройдет корректно.
Пример поиска и перезаписи файла в
архиве:
метод НайтиИПереписатьФайл(ПутьКАрхиву: Строка, ИмяФайла: Строка, НовыеДанные: ПотокЧтения)
пер Архив = новый ФайлZip(ПутьКАрхиву)
// Не помним точный путь к файлу в архиве, но помним имя.
пер Элементы = Архив.Найти(ИмяФайла)
если Элементы.Размер() > 1
// Файл с таким именем не один, нужно уточнить путь
Консоль.Записать("Файл с таким именем не один, нужно уточнить путь")
возврат
;
пер ИскомыйЭлемент = Элементы.Получить(0)
Консоль.Записать("Удаляем старый файл из архива со временем изменения: " + ИскомыйЭлемент.ВремяИзменения)
пер ПутьКЭлементуВАрхиве = ИскомыйЭлемент.ПутьВАрхиве
// Заменяем файл.
Архив.Удалить(ИскомыйЭлемент)
пер КолВо = Архив.Элементы().Размер()
Архив.Добавить(НовыеДанные, ПутьКЭлементуВАрхиве, УровеньСжатия.Максимальный)
// Убедимся, что файл в архиве.
если КолВо + 1 = Архив.Элементы().Размер()
Консоль.Записать("Операция замены успешна")
;
;