HomeРазноеС работа с zip: Небольшое тестирование двух библиотек для работы с ZIP архивами (язык C#) / Хабр

С работа с zip: Небольшое тестирование двух библиотек для работы с ZIP архивами (язык C#) / Хабр

Содержание

Чтение и запись ZIP в языке 1С 8.3, 8.2 (в примерах)

Чтение и запись ZIP в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2020-01-27T21:20:38+00:00 XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

Оглавление (нажмите, чтобы раскрыть)

&НаКлиенте
Процедура РаботаСZipАрхивами()
 
    /// Как создать zip-архив из 1с 8.3, 8.2    
 
    НовыйАрхив = Новый ЗаписьZipФайла(
        "c:\test.zip",
        "", // пароль на архив (оставим пустой)
        "Этот архив создан из 1с", // комментарий к архиву
        МетодСжатияZIP.Сжатие, // сжатие или копирование
        УровеньСжатияZIP.Оптимальный,
        МетодШифрованияZIP.Zip20
    );
 
    /// Как добавить файл в zip-архив из 1с 8.3, 8.2
 
    НовыйАрхив.Добавить(
        "c:\readme.txt" // указываем полный путь к файлу
    );
 
    /// Как добавить группу файлов (по маске) в zip-архив
    /// из 1с 8.3, 8.2
 
    // Предположим, что в папке "c:\work" находятся файлы
    // с расширением txt, добавим их все в архив.
 
    НовыйАрхив.Добавить(
        "c:\work\*.txt" // указываем маску к файлам
    );
 
    // А что если в "c:\work" находится другая папка, в которой
    // в свою очередь тоже есть txt файлы. Чтобы обработать
    // и эти файлы наш предыдущий пример следует изменить вот так:    
 
    НовыйАрхив.Добавить(
        "c:\work\*.txt", // указываем маску к файлам
        РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
        РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно
    );
 
    // Записываем созданный архив на диск компьютера.
    НовыйАрхив.Записать();
 
    /// Как открыть и добавить файл в уже существующий
    /// zip-архив из 1с 8.3, 8.2
 
    // К сожалению, библиотека языка не предоставляет нам такой возможности.
    // Поэтому надо или сначала распаковать весь архив в локальную папку (об этом ниже),
    // далее добавить в эту папку нужный файл и, наконец, снова запаковать её в архив.
    // Но я рекомендую освоить консольный архиватор 7-zip (он предоставляет
    // все возможности по модификации уже созданных архивов) и вызывать его через
    // команду ЗапуститьПриложение
 
    /// Как распаковать zip-архив из 1с 8.3, 8.2
 
    // Распакуем test.zip в папку "c:\zip_out"
 
    Архив = Новый ЧтениеZipФайла(
        "c:\test.zip", // путь к архиву
        "" // пароль к архиву
    );
 
    // Сообщим комментарий к архиву.
    Сообщить(Архив.Комментарий);
 
    // Распакуем все файлы разом.
    Архив.ИзвлечьВсе("c:\zip_out",
        РежимВосстановленияПутейФайловZIP.Восстанавливать);
 
    // Распакуем файлы по одиночке.    
    Для Каждого Элемент Из Архив.Элементы Цикл
        Сообщить(Элемент.ПолноеИмя);
        Архив.Извлечь(
            Элемент, // элемент для извлечения
            "c:\zip_out",
            РежимВосстановленияПутейФайловZIP.Восстанавливать,
            "" // пароль
        );
    КонецЦикла;    
 
КонецПроцедуры

Чтение и запись ZIP в языке 1С 8.3, 8.2 (в примерах)

XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Работа с zip архивами в .NET / Хабр

Недавно мне в моем .NET/С# проекте подребовался функционал создания и распаковки zip архивов. Казалось бы, очень простые операции, учитывая что Windows Explorer уже давно умеет работать с zip файлами и я предположил, что API для работы с ними Microsoft предоставляет.

Отсутствие классов для работы с zip в .NET фреймворк большим сюрпризом для меня не стало, но и не сильно обрадовало. Отсутствие функционала для работы с zip в различных unmanaged API Windows (WinAPI, COM интерфейсы и т.д) меня раздосадовало. На данный момент весь исходный код проекта разработан мной и включать дополнительный third-party .dll файл в дистрибутив из за простейшего функционала мне не хотелось.


После поисков в интернете и в msdn, выбирал из следующих решений:

  1. В .NET Framework есть класс System.IO.Packaging.ZipPackage, но как я понял, полноценно работать с zip архивами при помощи него нельзя и к тому же он появился только в .NET 3.5, привязывать к которому свой проект мне не очень то хотелось. Это класс использует класс MS.Internal.IO.Zip.ZipArchive, но, как видно из названия, доступ к нему закрыт. Интересно, почему.
  2. В .NET Framework для J# присутствует класс java.util.zip.ZipFile и на MSDN есть статья, как использовать его из C#. Но Visual J# Framework не входить в состав .NET Framework, соответственно нужно включать Visual J# Redistributable Package в свой дистрибутив, а это 3.6 мегабайта в общем то бесполезного для меня кода. Не слишком элегантно.
  3. minizip — надстройка над zlib, написан на Cи. Для использования в .NET потребуется dll сборка + interop.
  4. Third-party библиотеки SharpZipLib и DotNetZip. Обе полностью написаны и предоставляют достаточно широкий функционал.

Есть еще вариант работы с zip файлами при помощьи Shell API, но лично мне он кажется уж слишком извращенным, и к примеру, распаковать zip архив, находящийся в памяти, с помощью него не получится.

Ни один из вышеперечисленных вариантов полностью меня не устраивал, и я решил разработать свой. В .NET Framework есть класс System.IO.Compression.DeflateStream, который умеет упаковывать и распаковывать данные на основе алгоритма deflate. Требуется только уметь читать/писать внутреннюю структуру zip архива, которая описана в спецификации.

В результате я за пару дней разработал небольшую и простую библиотеку, умеющую рапаковывать и создавать zip файлы, как в файловой системе, так и в памяти:

  • Поддерживает только алгоритм сжатия deflate и, конечно, store.
  • Умеет работать с архивами содержащими именама файлов в utf8.
  • Нормально распаковывает zip архивы созданные WinRAR, и, вероятно, многими другими программами под Windows. Неподдерживаемые моей библиотекой zip архивы мне также встречались

Конечно, полноценной поддержки всего формата ZIP(шифрование, различные алгоритмы сжатия, extra fields и т.д) в ней нет, это оргомный объем работы и все вышеперечисленный решения ее так же не предоставляют. Мое решение приемлимо только для ситуаций, когда заранее известно, что формат архива поддерживается библиотекой и архивы не будут напрямую поступать от пользователя приложения. В моем проекте эти требования выполняются, поэтому разработанное решение меня вполне устроило.

Я не ставил задачу разработать open source библиотеку, с документацией и удобным API. Я лишь хотел рассказать и привести пример работы с ZIP из .NET без использования сторонних библиотек.

Скачать исходники и пример можно здесь.

Буду рад если кому нибудь пригодится:)

что это за формат файлов и какие архиваторы существуют?

Создание zip-архивов позволяет экономить память, перемещать и передавать файлы между пользователями, а также удобно организовывать хранение документов. Сегодня мы расскажем что из себя представляет zip-формат и как с ним работать.

Что это такое?

Zip – универсальный формат сжатия и архивации файлов. Файл любого типа после архивации с помощью специализированных программ или встроенных функций Windows приобретает именно это разрешение.

Как открыть файл?

Рассмотрим как открыть zip-файл с помощью встроенных возможностей Windows:

  1. Выделите zip-файл (иконка папки с замком). Кликните на него правой кнопкой мыши, выберете позицию «Извлечь все».
  2. Далее откроется окно распаковки архива. В нем можно выбрать папку, в которую произойдет извлечение архива (написать путь самостоятельно или выбрать папку с помощью кнопки Обзор).
  3. Нажмите кнопку Извлечь в нижнем углу окна.

Теперь все файлы архива извлечены в указанную папку.

Если не указать путь извлечения архива, то файлы попадут в автоматически созданную папку с именем распакованного архива. В других специализированных форматах открытие происходит тем же образом.

Как его получить?

Загадочный ZIP-файл. Что это и как его получить?

Загадочный ZIP-файл. Что это и как его получить?Существует два способа добавить несколько файлов в архив. Для первого способа:

  1. Выделите файл или группу файлов, которые вы хотели бы архивировать.
  2. Кликните по ним правой кнопкой мыши, в выпавшем списке выберете позицию «Отправить», затем «Сжатая папка-ZIP».

Для второго способа:

  1. На пустом месте экрана кликните правой кнопкой мыши.
  2. В открывшемся списке выберете «Создать», далее «Сжатая папка ZIP».
  3. Далее выделите нужные файлы и перетащите их мышью на иконку созданной сжатой папки.

Если при создании сжатой папки не задать ей имя, она автоматически примет имя одного из добавленных в нее файлов. В других программах создание архива происходит по схожему алгоритму.

Архиваторы

На сегодняшний момент кроме стандартного архиватора Windows существует множество специализированных программ, с расширенным арсеналом функций. Мы расскажем о самых популярных программах:

  • WinRAR. Одна из самых популярных бесплатных программ для работы с архивами. Может создавать архивы типа .rar и .zip, распаковывать может значительно больше форматов. В рамках работы с WinRAR возможно создавать комментарии к созданным архивам.
  • 7-Zip. По сравнению с WinRAR имеет значительно больше возможностей архивации файлов. Формат zip поддерживает как для создания архива, так и для распаковки. Имеет усовершенствованные алгоритмы, что позволяет сжимать файлы до меньшего размера в ускоренном режиме.
  • IZArc. Усовершенствованная бесплатная утилита для работы с архивами. Работает с теми же форматами архивов, что и 7-Zip. Отличает IZArc возможность работы с образами дисков (ISO,CDI) и работа с самораспаковывающимися архивами. Также с ее помощью можно восстанавливать поврежденные архивы без дополнительных программ.
  • PeaZip. Программа представляет собой кроссплатформенный портативный бесплатный архиватор. Дает возможность создания, открытия и распаковки архивов формата zip. Дает возможность использования уникального формата архивирования pea с особой системой шифрования.

Использование архивов типа zip экономит время и дарит множество новых возможностей пользователю. Не стоит пугаться неизвестных форматов и программ, работа с ними практически интуитивная и значительно облегчит вашу жизнь.

Работа с ZIP-архивами в Delphi – Delphi в Internet

Пост восстановлен после переезда сайта на новый хостинг. Работа с zip в delphi появилась ещё в Delphi XE2. Однако это событие осталось практически незамеченным на фоне других нововведений, которыми пестрила Delphi XE2: разработка под MacOS и, соответственно, библиотеки Firemonkey, механизм LiveBinding и прочие “фичи”, лежащие на поверхности. А про модуль delphi System.Zip особенно никто подробно и не рассказывал, разве, что здесь была небольшая заметка про zip в delphi. Сегодня я буду рассматривать работу с zip в delphi с позиции использования System.Zip в Delphi 10.3 Rio.

Введение

Для работы с ZIP-архивами в Delphi используется класс TZipFile. Этот класс предоставляет основные возможности для работы с zip, такие как чтение содержимого архива, запись архива, чтение заголовка архивного файла, упаковка и распаковка zip в delphi. И, несмотря на то, что TZipFile не содержит методов и свойств, непосредственно используемых для запароленных архивов, этот класс может предоставлять пользователю информацию о том, что файл зашифрован для того, чтобы использовать другие библиотеки delphi для распаковки зашифрованных zip-архивов.

Работу с модулем System.Zip и, в частности, с классом TZipFile, рассмотрим на примерах.

Чтение содержимого zip архива в Delphi

Для демонстрации возможностей чтения zip в delphi попробуем прочитать архив test.zip, содержащий три файла – текстовый и две схемы XSD для KML:

Для начала, прочитаем имена файлов, содержащихся в zip-архиве. Делается это так:

var Zip: TZipFile;
    ArchiveFile: String;
begin
  Zip:=TZipFile.Create;
  try
    Zip.Open('test.zip',zmRead);
    for ArchiveFile in Zip.FileNames do
      ShowMessage(ArchiveFile);
    Zip.Close;
  finally
    Zip.Free;
  end;
end;

Здесь мы создаем объект zip архива, затем открываем архив для чтения, используя метод Open и, используя свойство TZipFile.FileNames, получаем имена файлов в архиве. На что стоит обратить внимание:

  1. Путь к файлу в TZipFile.FileNames определяется относительно zip архива;
  2. В свойстве TZipFile.FileNames содержатся как имена файлов, так и папок архива.

Так, в приведенном выше примере программа выдаст следующим список:

  • kml/2.3.0/
  • kml/2.3.0/atom-author-link.xsd
  • kml/2.3.0/ogckml23.xsd
  • kml/2.3.0/ReadMe.txt

Метод Open имеет две версии:

procedure Open(const ZipFileName: string; OpenMode: TZipMode); overload;
procedure Open(ZipFileStream: TStream; OpenMode: TZipMode); overload;

В одной версии мы передаем в качестве zip архива имя файла, а во втором – поток TStream, содержащий zip архив. При этом, второй параметр – OpenMode может принимать следующие значения:

TZipMode = (zmClosed, 
            zmRead, //открываем zip архив для чтения 
            zmReadWrite, //открываем zip архив для чтения и добавления новых файлов 
            zmWrite);//создаем новый архив

Кроме имен файлов в архиве мы также можем получить по нему такую информацию как размер в упакованном и неупакованном виде, метод сжатия, комментарий к файлу в архиве и так далее. Получается эта информация с использованием свойств:

property FileInfos: TArray read GetFileInfos;
property FileInfo[Index: Integer]: TZipHeader read GetFileInfo;

При этом тип TZipHeader имеет следующее описание:

  TZipHeader = packed record
    MadeByVersion:      UInt16; // Start of Central Header
    RequiredVersion:    UInt16; // Start of Local Header
    Flag:               UInt16;
    CompressionMethod:  UInt16;
    ModifiedDateTime:   UInt32;
    CRC32:              UInt32;
    CompressedSize:     UInt32;
    UncompressedSize:   UInt32;
    FileNameLength:     UInt16;
    ExtraFieldLength:   UInt16; // End of Local Header
    FileCommentLength:  UInt16;
    DiskNumberStart:    UInt16;
    InternalAttributes: UInt16;
    ExternalAttributes: UInt32;
    LocalHeaderOffset:  UInt32; // End of Central Header
    FileName: TBytes;
    ExtraField: TBytes;
    FileComment: TBytes;
    function GetUTF8Support: Boolean;
    procedure SetUTF8Support(value: Boolean);
    property UTF8Support: Boolean read GetUTF8Support write SetUTF8Support;
  end;

Попробуем получить информацию по файлам и папкам в нашем тестовом архиве. В коде ниже считывается информация о файле из архива: комментарий, метод сжатия, размер файла в сжатом и несжатом состоянии, контрольная сумма и дата последнего изменения файла.

var
  Header: TZipHeader;
  Date: TDateTime;
begin
  Memo1.Lines.Clear;
  Header := Zip.FileInfos[ListBox1.ItemIndex];
  Memo1.Lines.Add('FileComment ' + StringOf(Header.FileComment));
  Memo1.Lines.Add('Method ' + TZipCompressionToString(TZipCompression(Header.CompressionMethod)));
  Memo1.Lines.Add('CompressedSize ' + Header.CompressedSize.ToString);
  Memo1.Lines.Add('UncompressedSize ' + Header.UncompressedSize.ToString);
  Memo1.Lines.Add('CRC32 ' + Header.CRC32.ToString);
  WinFileDateToDateTime(Header.ModifiedDateTime, Date);
  Memo1.Lines.Add('ModifiedDateTime ' + DateTimeToStr(Date));
end;

Здесь мы использовали два новых метода.

function TZipCompressionToString(Compression: TZipCompression): string;

Возвращает “человекопонятный” метод сжатия файла по значению, полученному из заголовка. TZipCompression – это перечислитель, содержащий все доступные методы сжатия файла.
Второй метод (WinFileDateToDateTime) переводит значение даты/времени из формата Windows в обычный TDateTime. Этот метод в System.Zip почему-то не публичный, в отличие от TZipCompressionToString, поэтому пришлось его “вытащить наружу”, метод выглядит следующим образом:

function WinFileDateToDateTime(FileDate: UInt32; out DateTime: TDateTime): Boolean;
var
  LDate: TDateTime;
  LTime: TDateTime;
begin
    Result := TryEncodeDate(
    LongRec(FileDate).Hi shr 9 + 1980,
    LongRec(FileDate).Hi shr 5 and 15,
    LongRec(FileDate).Hi and 31,
    LDate);
 
  if Result then
  begin
    Result := TryEncodeTime(
      LongRec(FileDate).Lo shr 11,
      LongRec(FileDate).Lo shr 5 and 63,
      LongRec(FileDate).Lo and 31 shl 1, 0, LTime);
 
    if Result then
      DateTime := LDate + LTime;
  end;
end;

Распаковка файлов из ZIP в Delphi

Следующий момент – распаковка архива. Здесь TZipFile предоставляет возможность распаковки как отдельного файла, так и сразу всех файлов, содержащихся в архиве.

Для того, чтобы распаковать отдельный файл используется одна из версий метода:

procedure Extract(const FileName: string; const Path: string = ''; CreateSubdirs: Boolean = True); overload;
procedure Extract(Index: Integer; const Path: string = ''; CreateSubdirs: Boolean = True); overload;

Здесь:

  • FileName – файл, который необходимо распаковать (см. свойство TZipFile.FileNames)
  • Index – индекс файла в TZipFile.FileNames
  • Path – путь по которому необходимо разместить распакованный файл. По умолчанию файл размещается в директории рядом с exe-файлом
  • CreateSubdirs – указывает на то, следует ли воссоздать полный путь к файлу (True) или нет (False)

Для распаковки всего zip архива в delphi используется следующий метод:

procedure ExtractAll(const Path: string = '');

Если же вам необходимо содержимое какого-либо файла для дальнейшей работы в программе, то можно воспользоваться следующими методами:

procedure Read(const FileName: string; out Bytes: TBytes); overload;
procedure Read(Index: Integer; out Bytes: TBytes); overload;

Первый параметр в этих процедурах имеет тот же смысл, что и в методах Extract, а второй – массив байтов в который необходимо сохранить содержимое файла. Например, так можно вывести в Memo текст xsd-файла из нашего тестового архива:

var Bytes: TBytes;
begin
  Zip.Read(ListBox1.Items[ListBox1.ItemIndex],//файл из zip архива, выбранный в списке ListBox1
           Bytes);
  Memo1.Lines.Text:=StringOf(Bytes);
end;

Создание zip архива в Delphi

Для создания zip архива в delphi необходимо:

  1. Создать экземпляр TZipFile с режимом доступа zmReadWrite
  2. Добавить в архив файлы, используя метод TZipFile.Add
  3. Выполнить метод TZipFile.Close
  4. Уничтожить экземпляр TZipFile

Метод Add имеет следующее описание:

procedure Add(const FileName: string; const ArchiveFileName: string = ''; Compression: TZipCompression = zcDeflate); overload;
procedure Add(Data: TBytes; const ArchiveFileName: string; Compression: TZipCompression = zcDeflate); overload;
procedure Add(Data: TStream; const ArchiveFileName: string; Compression: TZipCompression = zcDeflate; AExternalAttributes: TFileAttributes = []); overload;
procedure Add(Data: TStream; LocalHeader: TZipHeader; CentralHeader: PZipHeader = nil); overload;

Здесь

  • FileName – имя внешнего файла, который необходимо добавить в архив
  • Data – содержимое внешнего файла, который необходимо добавить в архив
  • ArchiveFileName – имя файла в архиве
  • Compression – метод сжатия файла

Например, напишем консольное приложение, которое будет находить все файлы в папке archive рядом с exe-файлом и упаковывать их без всякой структуры в архив с названием test.zip:

program Archivator;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.SysUtils,
  System.Zip,
  System.IOUtils;
 
const
  cZipName = 'test.zip';
  cZipFolder ='archive';
 
var ZipFile: TZipFile;
    zName: string;
    searchPath: string;
    ArchiveFiles: TArray;
    AFile: string;
begin
  //задаем имя zip архива
  zName:=TPath.Combine(ExtractFilePath(ParamStr(0)),
                      cZipName);
  //задаем путь к папке с файлами для упаковки
  searchPath:=TPath.Combine(ExtractFilePath(ParamStr(0)),
                      cZipFolder);
  ZipFile:=TZipFile.Create;
  try
    ZipFile.Open(zName,zmWrite);
    //ищем все файлы в директории
    ArchiveFiles:=TDirectory.GetFiles(searchPath);
    //добавляем все найденные файлы в архив
    for AFile in ArchiveFiles do
      begin
        Writeln('Добавляем в архив файл '+AFile);
        ZipFile.Add(AFile, ExtractFileName(AFile), zcDeflate);
      end;
    //закрываем файл
    ZipFile.Close;
  finally
    //уничтожаем TZipFile
    FreeAndNil(ZipFile);
  end;
  readln;
end.

Соответственно, если вам необходимо создать сложную структуру zip архива в delphi с папками, подпапками и так далее, то просто изменяете параметр ArchiveFileName, добавляя необходимые пути.

Как работать с запароленными zip архивами в Delphi

Как я писал выше, к сожалению в TZipFile нет как таковых механизмов и методов работы с zip архивами с паролем. Однако, можно проверить наличие шифрования у архива и переадресовать работу с таким архивом другой библиотеке. Для того, чтобы определить, что файл зашифрован, необходимо определить обработчик события OnCreateDecompressStream или определить callback-функцию CreateDecompressStreamCallBack.

Например, определить, что zip архив защищен паролем можно так:

Назначаем обработчик OnCreateDecompressStream

var ZipFile: TZipFile;
begin
  ZipFile:=TZipFile.Create;
  ZipFile.OnCreateDecompressStream := OnCreateDecompressStream;
  ZipFile.Open('Password.zip',zmRead);
  try
    ZipFile.ExtractAll();
  finally
    ZipFile.Free;
  end;
end;

Сам обработчик выглядит следующим образом:

function TForm13.OnCreateDecompressStream(const InStream: TStream;
  const ZipFile: TZipFile; const Item: TZipHeader;
  IsEncrypted: Boolean): TStream;
begin
  try
    if IsEncrypted then
    begin
      ShowMessage('Зашифровано');
    end
    else
      Result := InStream;
  except
    on E: Exception do
    begin
      Result := InStream;
    end;
  end;
end;

В принципе, этот подход был показан давным давно в официальной документации Embarcadero. Однако, при тестировании TZipFile обнаружилось, что, если файл зашифрован одним из методов AES (AES128, AES192, AES256), то вызывается исключение при создании потока TZDecompressionStream и, следовательно, до вызова события OnCreateDecompressStream дело не доходит. Методом AES позволяет шифровать файлы, например, тот же Total Commander:

Однако, если выбрать способ ZIP 2.0, то все работает как надо.

Отображение прогресса создания или распаковки zip архива в Delphi

При добавлении в zip архив большого файла или, наоборот, распаковки большого zip архива в delphi хотелось бы, чтобы наша программа не “висла”. TZipFile предоставляет такую возможность с помощью события OnProgress:

TZipProgressEvent = procedure(Sender: TObject; FileName: string; Header: TZipHeader; Position: Int64) of object;

Здесь

  • FileName – имя файла, который в данный момент обрабатывается
  • Header – информация о файле
  • Position – количество обработанный байт файла

Например, чтобы получить текущий прогресс упаковки файла в zip архив в delphi можно использовать простую формулу:

Position / Header.UnCompressedSize)*100

Ну и, конечно, если вы работаете с TZipFile не в отдельном потоке, то стоит в обработчике также указать:

Application.ProcessMessages

Вот, в принципе и вся основная информация по работе delphi с zip архивами “из коробки”. Остается только добавить, что помимо рассмотренных выше методов и свойств у TZipFile также имеются классовые методы, позволяющие работать с zip архивами без создания экземпляра TZipFile.

5
1
vote

Рейтинг статьи

Python 3: Работа с zip архивами. Модуль ZipFile

Импорт модуля ZipFile:

Работа с zip архивами:

ZipFile(filename [, mode [, compression [, allowZip64]]])

filename — имя файла zip архива.

mode:

  • r — файл будет открыт для чтения;
  • w — если файл существует, то он будет уничтожен и вместо него будет создан новый файл;
  • a — существующий файл будет открыт в режиме добавления в конец.

compression определяет метод сжатия, который должен использоваться при записи в архив. Он принимает одно из значений: ZIP_STORED или ZIP_DEFLATED. По умолчанию используется значение ZIP_STORED. Последний аргумент

allowZip64 позволяет разрешить использование расширений ZIP64, которые дают возможность создавать архивы размером больше 2 гигабайт. По умолчанию равен False.

Итак, давайте откроем наш ранее созданный архив для чтения:

Является ли файл zip архивом:

zipfile.is_zipfile('xml_healer.zip')
True

Чтение архива:

z = zipfile.ZipFile('xml_healer.zip', 'r')

Просмотр содержимого:

Извлечение содержимого:

z.extract('file') # Извлечь файл из архива

z.extractall()    # Извлечь все файлы

Запись содержимого:

with zipfile.ZipFile('spam.zip', 'w') as myzip:
    myzip.write('file')
z = zipfile.ZipFile('spam.zip', 'w')
z.write('file')
z.close()

Для записи всех файлов в директории можно воспользоваться функцией os.walk:

import zipfile
import os

z = zipfile.ZipFile('spam.zip', 'w')        # Создание нового архива
for root, dirs, files in os.walk('folder'): # Список всех файлов и папок в директории folder
for file in files:
   z.write(os.path.join(root,file))         # Создание относительных путей и запись файлов в архив

z.close()

Закрытие архива:

Технические хитрости и хитрости: работа с Zip-файлами

Урок 3: Работа с Zip-файлами

/ ru / techsavvy / find-your-downloads / content /

Что такое zip-файл?

ZIP-файл

ZIP-файл — это способ сгруппировать , или , заархивировать , несколько файлов, чтобы они действовали как один файл. Например, предположим, что вы хотите отправить кому-нибудь по электронной почте папку с документами Word. Вы можете прикрепить каждый файл индивидуально, но это займет много времени, особенно если документов много.Лучшим решением было бы поместить все файлы в zip-файл, а затем прикрепить zip-файл к своей электронной почте.

Еще одним преимуществом zip-файлов является то, что они сжаты до , что означает, что общий размер файла меньше. Если вы отправляете кому-то zip-файл или публикуете его в Интернете, загрузка займет на меньше времени — и ваши получатели также смогут загрузить его быстрее.

Некоторые форматы файлов, например изображения MP3 и JPEG, уже сжаты.Вы все еще можете заархивировать эти типы файлов, но размер файла может быть ненамного меньше.

Создание zip-файлов

Используете ли вы Windows или macOS, не требует дополнительного программного обеспечения для создания и открытия zip-файлов. Это потому, что основные функции zip-файла встроены в операционную систему.

Для создания zip-файла в Windows:
  1. Выберите файлы, которые вы хотите добавить в zip-файл.

    Выбор файлов

  2. Щелкните правой кнопкой мыши по одному из файлов.Появится меню. Щелкните правой кнопкой мыши файл
  3. В меню щелкните Отправить на и выберите Сжатая (заархивированная) папка . Создание zip-файла
  4. Появится zip-файл. Если хотите, вы можете ввести новое имя для zip-файла.

    Ввод нового имени для zip-файла

В Windows после создания zip-файла вы можете добавить в него другие файлы , перетащив их на значок zip-файла.

Добавление документа в zip-файл

Для создания zip-файла в macOS:
  1. Выберите файлы, которые вы хотите добавить в zip-файл.

    Выбор файлов

  2. Щелкните правой кнопкой мыши по одному из файлов. Если щелчок правой кнопкой мыши не включен, вы можете удерживать клавишу Control и затем щелкнуть. Появится меню.

    Щелкните файл правой кнопкой мыши

  3. В меню щелкните Сжать 12 элементов (

.

zipfile — Работа с ZIP-архивами — документация Python 3.8.5

Исходный код: Lib / zipfile.py


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

Этот модуль в настоящее время не обрабатывает многодисковые файлы ZIP.
Он может обрабатывать ZIP-файлы с расширениями ZIP64.
(это ZIP-файлы размером более 4 ГиБ).Он поддерживает
расшифровка зашифрованных файлов в ZIP-архивах, но в настоящее время не может
создать зашифрованный файл. Расшифровка происходит очень медленно, так как
реализован на собственном Python, а не на C.

Модуль определяет следующие позиции:

исключение zipfile. BadZipFile

Ошибка для плохих файлов ZIP.

исключение zipfile. BadZipfile

Псевдоним BadZipFile , для совместимости со старыми версиями Python.

Не рекомендуется, начиная с версии 3.2.

исключение zipfile. LargeZipFile

Ошибка возникает, когда для ZIP-файла требуются функции ZIP64, но у него
не был включен.

класс zip-файл. ZipFile

Класс для чтения и записи файлов ZIP. См. Раздел
ZipFile Objects для деталей конструктора.

класс zip-файл. Путь

Совместимая с pathlib оболочка для zip-файлов. См. Раздел
Объекты пути для подробностей.

класс zip-файл. PyZipFile

Класс для создания ZIP-архивов, содержащих библиотеки Python.

класс zip-файл. ZipInfo ( filename = ‘NoName’ , date_time = (1980 , 1 , 1 , 0 , 0 , 0) )

Класс, используемый для представления информации об элементе архива.Инстансы
этого класса возвращаются getinfo () и infolist ()
методы ZipFile объектов. Большинство пользователей модуля zipfile
не нужно будет их создавать, а использовать только те, которые созданы этим
модуль. filename должно быть полным именем члена архива, а
date_time должен быть кортежем, содержащим шесть полей, описывающих время
последней модификации файла; поля описаны в разделе
Объекты ZipInfo.

zip-файл. is_zipfile ( имя файла )

Возвращает True , если filename является допустимым ZIP-файлом на основе его магического номера,
в противном случае возвращает False . filename также может быть файлом или файловым объектом.

Изменено в версии 3.1: Поддержка файловых и файловых объектов.

zip-файл. НА ЗАПОМНИТЕ

Числовая константа для несжатого элемента архива.

zip-файл. ZIP_DEFLATED

Числовая константа для обычного метода сжатия ZIP. Это требует
Модуль zlib .

zip-файл. ZIP_BZIP2

Числовая константа для метода сжатия BZIP2. Это требует
bz2 модуль.

zip-файл. ZIP_LZMA

Числовая константа для метода сжатия LZMA.Это требует
Модуль lzma .

Примечание

Спецификация формата файла ZIP включает поддержку сжатия bzip2.
с 2001 года, а для сжатия LZMA с 2006 года. Однако некоторые инструменты
(включая более старые версии Python) не поддерживают это сжатие
методы, и может либо вообще отказаться от обработки ZIP-файла,
или не удается извлечь отдельные файлы.

См. Также

PKZIP Application Note

Документация по формату ZIP-файла, подготовленная Филом Кацем, создателем этого формата и
используемые алгоритмы.

Домашняя страница Info-ZIP

Информация о программах ZIP-архива проекта Info-ZIP и разработке
библиотеки.

Объекты ZipFile

класс zip-файл. ZipFile ( файл , mode = ‘r’ , сжатие = ZIP_STORED , allowZip64 = True , compresslevel = None , * , strict_timestamps = True )

Откройте ZIP-файл, где файл может быть путем к файлу (строка),
файловый объект или объект, подобный пути.

Режим параметр должен быть 'r' для чтения существующего
file, 'w' для обрезки и записи нового файла, 'a' для добавления в
существующий файл или 'x' для монопольного создания и записи нового файла.
Если режим равен 'x' и файл относится к существующему файлу,
будет вызвана ошибка FileExistsError .
Если режим — это , то файл и указывает на существующий ZIP-архив.
файл, то к нему добавляются дополнительные файлы.Если файл не относится к
ZIP-файл, затем к нему добавляется новый ZIP-архив. Это предназначено для
добавление ZIP-архива в другой файл (например, python.exe ). Если
Режим — это 'a' , а файл вообще не существует, он создается.
Если режим равен 'r' или 'a' , файл должен быть доступен для поиска.

сжатие — это метод сжатия ZIP, используемый при записи архива,
и должен быть ZIP_STORED , ZIP_DEFLATED ,
ZIP_BZIP2 или ZIP_LZMA ; непризнанный
значения вызовут NotImplementedError .Если

.

Работа с файлами Zip и GZip в Java

Переполнение стека

  1. Около
  2. Товары

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. работы
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

12,4. zipfile — Работа с ZIP-архивами — документация Python 2.7.18

Исходный код: Lib / zipfile.py


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

Этот модуль в настоящее время не обрабатывает многодисковые файлы ZIP.Он может обрабатывать ZIP-файлы с расширениями ZIP64.
(то есть ZIP-файлы размером более 4 ГБ). Он поддерживает
расшифровка зашифрованных файлов в ZIP-архивах, но в настоящее время не может
создать зашифрованный файл. Расшифровка происходит очень медленно, так как
реализован на собственном Python, а не на C.

Модуль определяет следующие позиции:

исключение zipfile. BadZipfile

Ошибка возникает для плохих файлов ZIP (старое имя: zipfile.ошибка ).

исключение zipfile. LargeZipFile

Ошибка возникает, когда для ZIP-файла требуются функции ZIP64, но у него
не был включен.

класс zip-файл. ZipFile

Класс для чтения и записи файлов ZIP. См. Раздел
ZipFile Objects для деталей конструктора.

класс zip-файл. PyZipFile

Класс для создания ZIP-архивов, содержащих библиотеки Python.

класс zip-файл. ZipInfo ([ filename [, ​​ date_time ]])

Класс, используемый для представления информации об элементе архива. Инстансы
этого класса возвращаются getinfo () и infolist ()
методы ZipFile объектов. Большинство пользователей модуля zipfile
не нужно будет их создавать, а использовать только те, которые созданы этим
модуль. filename должно быть полным именем члена архива, а
date_time должен быть кортежем, содержащим шесть полей, описывающих время
последней модификации файла; поля описаны в разделе
Объекты ZipInfo.

zip-файл. is_zipfile ( имя файла )

Возвращает True , если filename является допустимым ZIP-файлом на основе его магического номера,
в противном случае возвращает False . filename также может быть файлом или файловым объектом.

Изменено в версии 2.7: Поддержка файловых и файловых объектов.

zip-файл. НА ЗАПОМНИТЕ

Числовая константа для несжатого элемента архива.

zip-файл. ZIP_DEFLATED

Числовая константа для обычного метода сжатия ZIP. Это требует
Модуль zlib .Никакие другие методы сжатия в настоящее время не поддерживаются.

См. Также

PKZIP Application Note

Документация по формату ZIP-файла, подготовленная Филом Кацем, создателем этого формата и
используемые алгоритмы.

Домашняя страница Info-ZIP

Информация о программах ZIP-архива проекта Info-ZIP и разработке
библиотеки.

12.4.1. Объекты ZipFile

класс zip-файл. ZipFile ( файл [, ​​ режим [, ​​ сжатие [, ​​ allowZip64 ]]])

Откройте ZIP-файл, где файл может быть либо путем к файлу (строка), либо
файловый объект. Режим параметр должен быть 'r' для чтения существующего
file, 'w' для обрезки и записи нового файла или 'a' для добавления в
существующий файл. Если режим — это , то файл и указывает на существующий ZIP-архив.
файл, то к нему добавляются дополнительные файлы.Если файл не относится к
ZIP-файл, затем к нему добавляется новый ZIP-архив. Это предназначено для
добавление ZIP-архива в другой файл (например, python.exe ).

Изменено в версии 2.6: Если режим равен a и файл вообще не существует, он создается.

сжатие — это метод сжатия ZIP, используемый при записи архива,
и должен быть ZIP_STORED или ZIP_DEFLATED ; непризнанный
значения вызовут RuntimeError .Если ZIP_DEFLATED
указан, но модуль zlib недоступен, RuntimeError
тоже поднят. По умолчанию — ZIP_STORED . Если allowZip64
True zipfile будет создавать ZIP-файлы с расширениями ZIP64, когда
размер zip-файла превышает 2 ГБ. Если ложно (по умолчанию) zipfile
вызовет исключение, если ZIP-файл потребует расширения ZIP64.
Расширения ZIP64 по умолчанию отключены, так как по умолчанию zip
и unzip команды в Unix (утилиты InfoZIP) не поддерживают
эти расширения.

Изменено в версии 2.7.1: Если файл создается в режиме 'a' или 'w' , а затем
закрыл без добавления файлов в архив, соответствующие
ZIP-структуры для пустого архива будут записаны в файл.

ZipFile также является диспетчером контекста и поэтому поддерживает
с заявлением . В этом примере myzip закрывается после
с набором операторов завершается, даже если возникает исключение:

 с помощью ZipFile ('spam.zip ',' w ') как myzip:
    myzip.write ( 'eggs.txt')
 

Новое в версии 2.7: Добавлена ​​возможность использовать ZipFile в качестве диспетчера контекста.

.

Отправить ответ

avatar
  Подписаться  
Уведомление о