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

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