Spec-Zone.ru › D

std.zip

Чтение и запись данных в формате архива zip.

Стандарты:
Текущая реализация в основном соответствует ISO/IEC 21320-1:2015, что означает,
  • что файлы могут храниться только без сжатия или с использованием механизма deflate,
  • что функции шифрования не используются,
  • что функции цифровой подписи не используются,
  • что функции данных с патчами не используются, и
  • что архивы могут не занимать несколько томов.
Кроме того, архивы проверяются на наличие вредоносных атак и отклоняются при обнаружении. Это включает
  • zip-бомбы, которые генерируют огромные объёмы распакованных данных
  • zip-архивы, содержащие перекрывающиеся записи
  • архивы zip-хамелеоны, которые генерируют различные распакованные данные в зависимости от реализации алгоритма распаковки
Текущая реализация использует библиотеку сжатия zlib.
Использование
Существует два основных способа использования: извлечение файлов из zip-архива и сохранение файлов в zip-архиве. Их можно комбинировать (например, прочитать архив, удалить некоторые файлы, добавить другие и записать новый архив).
Примеры:
Пример чтения существующего zip-архива:
import std.stdio : writeln, writefln;
import std.file : read;
import std.zip;

void main(string[] args)
{
    // read a zip file into memory
    auto zip = new ZipArchive(read(args[1]));

    // iterate over all zip members
    writefln("%-10s  %-8s  Name", "Length", "CRC-32");
    foreach (name, am; zip.directory)
    {
        // print some data about each member
        writefln("%10s  %08x  %s", am.expandedSize, am.crc32, name);
        assert(am.expandedData.length == 0);

        // decompress the archive member
        zip.expand(am);
        assert(am.expandedData.length == am.expandedSize);
    }
}
Пример записи файлов в zip-архив:
import std.file : write;
import std.string : representation;
import std.zip;

void main()
{
    // Create an ArchiveMembers for each file.
    ArchiveMember file1 = new ArchiveMember();
    file1.name = "test1.txt";
    file1.expandedData("Test data.\n".dup.representation);
    file1.compressionMethod = CompressionMethod.none; // don't compress

    ArchiveMember file2 = new ArchiveMember();
    file2.name = "test2.txt";
    file2.expandedData("More test data.\n".dup.representation);
    file2.compressionMethod = CompressionMethod.deflate; // compress

    // Create an archive and add the member.
    ZipArchive zip = new ZipArchive();

    // add ArchiveMembers
    zip.addMember(file1);
    zip.addMember(file2);

    // Build the archive
    void[] compressed_data = zip.build();

    // Write to a file
    write("test.zip", compressed_data);
}
Лицензия:
Лицензия Boost 1.0.
Авторы:
Walter Bright
Исходный код
std/zip.d
класс ZipException: object.Exception;

Выбрасывается при ошибке.

перечисление CompressionMethod: ushort;

Метод сжатия, используемый ArchiveMember.

none

Без сжатия, только архивирование.

deflate

Алгоритм deflate. Использует библиотеку zlib для сжатия.

класс ArchiveMember;

Один файл или каталог внутри архива.

строка name;

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

ubyte[] extra;

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

строка comment;

Комментарий, связанный с этим элементом.

ushort flags;

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

ushort internalAttributes;

Внутренние атрибуты. Бит 1 установлен, если элемент, по-видимому, в двоичном формате, и бит 2 установлен, если каждая запись предваряется длиной записи.

const pure nothrow @nogc @property @safe ushort extractVersion();

Версия формата zip-файла, необходимая для извлечения этого элемента.

Возвращает:
Версия формата, необходимая для извлечения этого элемента.
const pure nothrow @nogc @property @safe uint crc32();

Значение контрольной суммы CRC.

Возвращает:
Значение CRC32.
const pure nothrow @nogc @property @safe uint compressedSize();

Размер данных элемента в сжатом виде.

Возвращает:
Размер сжатого архива.
const pure nothrow @nogc @property @safe uint expandedSize();

Размер данных элемента в несжатом виде.

Возвращает:
Размер несжатого архива.
устаревшее const pure nothrow @nogc @property @safe ushort diskNumber();

Должно быть 0.

Возвращает:
Номер диска, на котором находится этот элемент.
pure nothrow @nogc @property @safe ubyte[] compressedData();

Данные элемента в сжатом виде.

Возвращает:
Данные файла в сжатом виде.
pure nothrow @nogc @property @safe ubyte[] expandedData();

@property @safe void expandedData(ubyte[] ed);

Получить или установить данные элемента в несжатом виде. При чтении существующего архива необходимо вызвать ZipArchive.expand прежде чем получить доступ к этим данным.

Параметры:
ubyte[] ed Расширенные данные.
Возвращает:
Данные файла.
@property @safe void fileAttributes(uint attr);

const nothrow @nogc @property uint fileAttributes();

Получить или установить атрибуты файла, специфичные для ОС, для этого элемента архива.

Параметры:
uint attr Атрибуты, полученные с помощью std.file.getAttributes или std.file.DirEntry.attributes.
Возвращает:
Атрибуты файла или 0, если атрибуты файла были закодированы для несовместимой ОС (Windows против POSIX).
const pure nothrow @nogc @property @safe DosFileTime time();

@property void time(SysTime time);

pure nothrow @nogc @property @safe void time(DosFileTime time);

Получить или установить время последнего изменения для этого элемента.

Параметры:
SysTime time Время для установки (будет сохранено как DosFileTime, что менее точно).
Возвращает:
Время последнего изменения в формате DosFileFormat.
const pure nothrow @nogc @property @safe CompressionMethod compressionMethod();

pure @property @safe void compressionMethod(CompressionMethod cm);

Получить или установить метод сжатия, используемый для этого элемента.

Параметры:
CompressionMethod cm Метод сжатия.
Возвращает:
Метод сжатия.
См. также:
CompressionMethod
pure nothrow @nogc @property @safe uint index(uint value);

const pure nothrow @nogc @property @safe uint index();

Индекс этого элемента архива в пределах архива. Установите это значение для другого переупорядочивания элементов архива.

Параметры:
uint value Значение индекса для установки.
Возвращает:
Индекс.
класс ZipArchive;

Объект, представляющий весь архив. ZipArchives — это коллекции ArchiveMembers.

string comment;

Комментарий к архиву. Длина должна быть меньше 65536 байт.

pure nothrow @nogc @property @safe ubyte[] data();

Массив, представляющий все содержимое архива.

Возвращает:
Данные всего содержимого архива.
deprecated const pure nothrow @nogc @property @safe uint diskNumber();

0, так как архивы с несколькими дисками не поддерживаются.

Возвращает:
Номер диска.
deprecated const pure nothrow @nogc @property @safe uint diskStartDir();

0, так как архивы с несколькими дисками не поддерживаются.

Возвращает:
Номер диска, с которого начинается центральный каталог.
deprecated const pure nothrow @nogc @property @safe uint numEntries();

const pure nothrow @nogc @property @safe uint totalEntries();

Количество ArchiveMembers в каталоге.

Возвращает:
Количество файлов в этом архиве.
const pure nothrow @nogc @property @safe bool isZip64();

pure nothrow @nogc @property @safe void isZip64(bool value);

Истинно, если архив находится в формате Zip64. Установите это значение в true, чтобы принудительно создать архив Zip64.

Параметры:
bool value Истинно, если архив должен быть создан в формате Zip64.
Возвращает:
Истинно, если архив находится в формате Zip64.
pure nothrow @nogc @property @safe ArchiveMember[string] directory();

Ассоциативный массив, индексируемый именем каждого члена архива.

Все члены архива могут быть доступны с помощью цикла foreach:

Пример
ZipArchive archive = new ZipArchive(data);
foreach (ArchiveMember am; archive.directory)
{
    writefln("member name is '%s'", am.name);
}
Возвращает:
Ассоциативный массив со всеми членами архива.
pure nothrow @nogc @safe this();

Конструктор для создания нового архива.

@safe void addMember(ArchiveMember de);

Добавить член в архив. Файл сжимается на лету.

Параметры:
ArchiveMember de Член, который нужно добавить.
Исключения:
ZipException, если используется неподдерживаемый метод сжатия или сжатие не удалось.
@safe void deleteMember(ArchiveMember de);

Удалить член de из архива. Используется имя члена для определения элемента для удаления.

Параметры:
ArchiveMember de Член, который нужно удалить.
pure @safe void[] build();

Создать все содержимое текущих членов архива.

Заполняет свойства data[], totalEntries и directory[]. Для каждого ArchiveMember заполняет свойства crc32, compressedSize, compressedData[].

Возвращает:
Массив, представляющий весь архив.
Исключения:
ZipException, если архив не может быть создан.
this(void[] buffer);

Конструктор для чтения существующего архива.

Заполняет свойства data[], totalEntries, comment[] и directory[]. Для каждого ArchiveMember заполняет свойства madeVersion, extractVersion, flags, compressionMethod, time, crc32, compressedSize, expandedSize, compressedData[], internalAttributes, externalAttributes, name[], extra[], comment[]. Используйте expand(), чтобы получить расширенные данные для каждого ArchiveMember.

Параметры:
void[] buffer Все содержимое архива.
Исключения:
ZipException, если архив был невалиден или если был обнаружен вредоносный код.
ubyte[] expand(ArchiveMember de);

Разархивировать содержимое члена.

Заполняет свойства extractVersion, flags, compressionMethod, time, crc32, compressedSize, expandedSize, expandedData[], name[], extra[].

Параметры:
ArchiveMember de Член, который нужно разархивировать.
Возвращает:
Расширенные данные.
Исключения:
ZipException, если запись невалидна или метод сжатия не поддерживается.

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_zip.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API