Бөлісу құралы:


Добавление zipArchiveEntry с помощью CompressionLevel задает флаги битов заголовка центрального каталога ZIP-каталога общего назначения

Спецификация ZIP-файла определяет, что биты 1 и 2 флага общего назначения в заголовке центрального каталога вложенной записи файла должны использоваться для указания уровня сжатия вложенного файла.

платформа .NET Framework задает эти биты при создании ZIP-файлов, лежащих в основе ZipPackage API. Во время миграции кода платформа .NET Framework в .NET эта функция была потеряна и в .NET биты 1 и 2 всегда были заданы 0 при создании новых записей файлов в ZIP-файле. Это критическое изменение восстанавливает эту возможность. Однако существующие клиенты .NET, которые указывают CompressionOption , когда вызов ZipArchive.CreateEntry увидит изменения значений флага общего назначения.

Прежнее поведение

Ранее .NET сохранила биты общего назначения для каждого ZipArchiveEntry уже в ZipArchive момент загрузки и добавления новых записей. Однако вызов ZipArchive.CreateEntry(String, CompressionLevel) всегда приводил к тому, что биты 1 и 2 остаются в значении 0по умолчанию, даже если используется другое CompressionLevelCompressionLevel.Optimal.

Это поведение имело подчиненный эффект: вызов Package.CreatePart(Uri, String, CompressionOption) с любым CompressionOption результатом в битах 1 и 2 осталось неустановленным (и поэтому CompressionOption всегда сохранялся в ZIP-файле как CompressionOption.Normal).

Новое поведение

Начиная с .NET 9 CompressionLevel параметр сопоставляется с флагами битов общего назначения, как указано в следующей таблице.

CompressionLevel Бит 1 Бит 2
NoCompression 0 0
Optimal 0 0
SmallestSize 1 0
Fastest 1 1

При вызове ZipArchive.CreateEntry(String, CompressionLevel) и указании CompressionLevel.NoCompressionметода сжатия вложенной записи файла задано значение Stored (а не значение Deflateпо умолчанию .)

Биты общего назначения для ZipArchiveEntry записей, которые уже существуют в объекте ZipArchive , по-прежнему сохраняются при добавлении нового ZipArchiveEntry .

Значения CompressionOptionPackage.CreatePart(Uri, String, CompressionOption) перечисления сопоставляются CompressionLevel с (и приводят к набору соответствующих битов), как показано в следующей таблице.

CompressionOption CompressionLevel
NotCompressed NoCompression
Normal Optimal
Maximum SmallestSize(платформа .NET Framework)
Optimal (.NET)
Fast Fastest
SuperFast Fastest

Представленные версии

.NET 9( предварительная версия 5)

Тип критического изменения

Это изменение поведения.

Причина изменения

Это критическое изменение было введено для восстановления существующего поведения платформа .NET Framework, которое было пропущено из .NET в точке переноса. Это изменение также дает подчиненным клиентам (например System.IO.Packaging) контроль над значением этих битов.

Если вы хотите убедиться, что новые ZipArchiveEntry записи добавлены в ZipArchive битовые флаги 0общего назначения, укажите или CompressionLevelCompressionLevel.OptimalCompressionLevel.NoCompression при вызове.ZipArchive.CreateEntry(String, CompressionLevel)

Если вы используете для Package.CreatePart(Uri, String, CompressionOption) добавления частей в пакет OPC, укажите или CompressionOptionCompressionOption.NotCompressedCompressionOption.Normal.

Затронутые API