ZipPacker
Запись ZIP по отдельным записям с явным завершением архива.
Создайте собственный ZipPacker, выберите CompressionLevel, проверьте Open, затем для каждой записи StartFile → WriteFile → CloseFile и в конце Close. WriteFile получает байты, не путь к исходному файлу; для текста явно кодируйте UTF-8. Dispose освобождает объект, но явный Close нужен для проверки завершения архива.
Create перезаписывает файл назначения, Addinzip дописывает записи существующего ZIP, Createafter создаёт новый ZIP после содержимого файла. Addinzip не заменяет запись того же имени: возникают дубликаты, а ZipReader читает первое совпадение. Это не транзакционное обновление файла.
Уровень -1 или 0..9 влияет на последующие StartFile и AddDirectory, не уже открытую запись. В текущем коде None=0 всё равно использует ZIP-метод Deflate с уровнем 0, не Store. Значение GetCompressionLevel читателя не восстанавливает настройку: например, 0 и 3 могут сообщаться как категория 6. Производительность и степень сжатия отдельно не измерялись.
AddDirectory пишет запись каталога и метаданные, не копирует дерево файлов с диска. StartFile при необходимости добавляет запись непосредственного родителя, не все уровни. Имена внутри архива используйте относительные с /. Права — метаданные ZIP, не chmod файлов; modifiedTime — UNIX-секунды, 0 означает текущее время. Текущая реализация прибавляет текущий часовой сдвиг хоста, а не исторический сдвиг указанной даты.
Проверены небольшие архивы Windows и совместимость чтения Python. Не подтверждены ZIP64, аварийное восстановление, повреждение/ошибки диска, применение прав при извлечении и работа на других платформах.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
ZipPackerКонструктор
public ZipPacker();Создаёт собственный упаковщик без открытого файла, CompressionLevel=-1. Настройку сжатия можно задать до Open. Записи и архив завершайте с проверкой Error, затем Dispose объект.
Свойства1
CompressionLevelСвойство
public int CompressionLevel { get; set; }Настройка -1 или 0..9 для следующей открываемой записи; default -1. Не меняет уже начатую запись и сохраняется после Close. None=0 в этом коде означает Deflate level 0, не ZIP Store. Некорректный уровень отклоняется с диагностикой; параметры сжатия не гарантируют конкретную скорость/размер.
Методы10
AddDirectoryError
public Error AddDirectory(string path, FileAccess.UnixPermissionFlags permissions = FileAccess.UnixPermissionFlags.ExecuteOther | FileAccess.UnixPermissionFlags.ReadOther | FileAccess.UnixPermissionFlags.ExecuteGroup | FileAccess.UnixPermissionFlags.ReadGroup | FileAccess.UnixPermissionFlags.ExecuteOwner | FileAccess.UnixPermissionFlags.WriteOwner | FileAccess.UnixPermissionFlags.ReadOwner, ulong modifiedTime = 0);Добавляет отдельную запись каталога, дописывая / при необходимости, и сразу её закрывает. Не сканирует файловую систему и не добавляет всех родителей. Повтор запомненного пути в этом сеансе отклоняется; список каталогов уже существующего ZIP в кеш автоматически не загружается. Вызывайте между файловыми записями, с проверкой Error.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
permissions | FileAccess.UnixPermissionFlags | FileAccess.UnixPermissionFlags.ExecuteOther | FileAccess.UnixPermissionFlags.ReadOther | FileAccess.UnixPermissionFlags.ExecuteGroup | FileAccess.UnixPermissionFlags.ReadGroup | FileAccess.UnixPermissionFlags.ExecuteOwner | FileAccess.UnixPermissionFlags.WriteOwner | FileAccess.UnixPermissionFlags.ReadOwner |
modifiedTime | ulong | 0 |
pathТочное имя записи внутри ZIP, обычно относительное с /; это не локальный путь назначения или источник данных.
permissionsФлаги UNIX-прав в метаданных ZIP, не применение прав файловой системы. Default 0644 для файла и 0755 для каталога; 0 также выбирает соответствующий default, а не запрет всех прав.
modifiedTimeUNIX-секунды, не миллисекунды; 0 — текущее время, не эпоха 1970. Запись переводится с текущим часовым сдвигом хоста и точностью ZIP-метаданных.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
CloseError
public Error Close();Завершает центральный каталог ZIP и закрывает файл; проверяйте Error.Ok до публикации результата. Текущая библиотека также завершает открытую запись, но отдельный CloseFile позволяет проверить её результат. Сохраняет CompressionLevel и очищает кеш добавленных каталогов при успехе. Повтор закрытия закрытого сеанса диагностируется.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
CloseFileError
public Error CloseFile();Завершает текущую запись, сохраняя архив открытым для следующей. После AddDirectory запись уже закрыта. Проверяйте Error.Ok; повторный вызов без текущей записи не является успешной операцией.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
GetCompressionLevelint
public int GetCompressionLevel();Читает сохранённую настройку упаковщика, не категорию из заголовка существующей записи. Не требует открытого архива.
intСохранённый уровень упаковщика -1 или 0..9.
OpenError
public Error Open(string path, ZipPacker.ZipAppend append = ZipPacker.ZipAppend.Create);Открывает назначение в режиме append, default Create перезаписывает файл. Addinzip дописывает записи, Createafter создаёт отдельный ZIP после существующих байтов. Если сеанс уже открыт, сначала вызывает Close, не передавая его ошибку напрямую: закрывайте явно. Родительский каталог назначения подготовьте заранее.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
append | ZipPacker.ZipAppend | ZipPacker.ZipAppend.Create |
pathПуть файла архива для FileAccess; для записи нужен доступный каталог и право записи. Это не имя записи внутри ZIP.
appendCreate=0 перезаписывает; Createafter=1 добавляет новый ZIP после байтов; Addinzip=2 дописывает записи существующего ZIP без замены имён.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
SetCompressionLevelvoid
public void SetCompressionLevel(int compressionLevel);Назначает CompressionLevel для последующих записей: -1 или 0..9. Можно до Open; текущую открытую запись не пересжимает.
| Имя | Тип | По умолчанию |
|---|---|---|
compressionLevel | int | — |
compressionLevel-1 для default либо целое 0..9; применяется к следующим записям. Уровень 0 не переключает метод ZIP на Store в текущей реализации.
StartFile2 перегрузки
public Error StartFile(string path);Начинает новую запись с именем path внутри открытого архива, а не читает исходный файл. При необходимости добавляет запись непосредственного родителя с 0755. Использует текущий уровень сжатия на момент вызова. Повтор имени создаёт дубликат, не замену. Завершайте предыдущую запись явно; метаданные этой записи задают permissions/modifiedTime. Этот overload задаёт 0644 и modifiedTime=0; не помечен Obsolete в SDK.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathТочное имя записи внутри ZIP, обычно относительное с /; это не локальный путь назначения или источник данных.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
public Error StartFile(string path, FileAccess.UnixPermissionFlags permissions = FileAccess.UnixPermissionFlags.ReadOther | FileAccess.UnixPermissionFlags.ReadGroup | FileAccess.UnixPermissionFlags.WriteOwner | FileAccess.UnixPermissionFlags.ReadOwner, ulong modifiedTime = 0);Начинает новую запись с именем path внутри открытого архива, а не читает исходный файл. При необходимости добавляет запись непосредственного родителя с 0755. Использует текущий уровень сжатия на момент вызова. Повтор имени создаёт дубликат, не замену. Завершайте предыдущую запись явно; метаданные этой записи задают permissions/modifiedTime.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
permissions | FileAccess.UnixPermissionFlags | FileAccess.UnixPermissionFlags.ReadOther | FileAccess.UnixPermissionFlags.ReadGroup | FileAccess.UnixPermissionFlags.WriteOwner | FileAccess.UnixPermissionFlags.ReadOwner |
modifiedTime | ulong | 0 |
pathТочное имя записи внутри ZIP, обычно относительное с /; это не локальный путь назначения или источник данных.
permissionsФлаги UNIX-прав в метаданных ZIP, не применение прав файловой системы. Default 0644 для файла и 0755 для каталога; 0 также выбирает соответствующий default, а не запрет всех прав.
modifiedTimeUNIX-секунды, не миллисекунды; 0 — текущее время, не эпоха 1970. Запись переводится с текущим часовым сдвигом хоста и точностью ZIP-метаданных.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
WriteFile2 перегрузки
public Error WriteFile(byte[] data);Записывает байты в текущую открытую запись. Несколько вызовов дописывают последовательные куски; путь к файлу и кодировку метод не определяет. Копируйте данные ограниченными порциями по своему бюджету памяти. Ошибку проверяйте по Error, а не только по последующему Close.
| Имя | Тип | По умолчанию |
|---|---|---|
data | byte[] | — |
dataБайты текущей записи; string сначала явно закодируйте, например UTF-8. Массив/ReadOnlySpan не является путём к файлу.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
public Error WriteFile(ReadOnlySpan<byte> data);Записывает байты в текущую открытую запись. Несколько вызовов дописывают последовательные куски; путь к файлу и кодировку метод не определяет. Копируйте данные ограниченными порциями по своему бюджету памяти. Ошибку проверяйте по Error, а не только по последующему Close.
| Имя | Тип | По умолчанию |
|---|---|---|
data | ReadOnlySpan<byte> | — |
dataБайты текущей записи; string сначала явно закодируйте, например UTF-8. Массив/ReadOnlySpan не является путём к файлу.
ErrorError.Ok при успехе; иначе ошибка текущего этапа, не гарантия неизменности файла.
ZipPacker.CompressionLevelEnum
| Значение | Описание |
|---|---|
Best = 9 | Уровень Deflate 9 для последующих записей. Не гарантирует минимальный размер для любого ввода или конкретное время упаковки. |
Default = -1 | Уровень -1: настройка zlib по умолчанию для последующих записей. Не значение, которое ZipReader обязан вернуть для такой записи. |
Fast = 1 | Уровень Deflate 1 для последующих записей. Скорость и размер зависят от данных; не меняет текущую запись. |
None = 0 | Уровень 0. В текущем упаковщике остаётся метод ZIP Deflate с уровнем 0, не метод Store. Проверено по заголовку созданного архива; не обещает конкретную скорость. |
ZipPacker.ZipAppend
| Значение | Описание |
|---|---|
Addinzip = 2 | 2: дописывает записи существующего ZIP. Повтор имени добавляет ещё одну запись, не заменяет старую. |
Create = 0 | 0: создаёт ZIP с перезаписью файла назначения. Для сохранения существующего ZIP это неподходящий режим. |
Createafter = 1 | 1: создаёт новый ZIP после содержимого существующего файла; не дописывает записи в прежний ZIP как Addinzip. |