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

Для работы с 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 = Архив.Элементы().Размер()
        Консоль.Записать("Операция замены успешна")
    ;
;