Partilhar via


Adicionar um ZipArchiveEntry com CompressionLevel define sinalizadores de bits de uso geral do cabeçalho do diretório central ZIP

A especificação do arquivo ZIP define que os bits 1 & 2 do sinalizador de bits de uso geral no cabeçalho do diretório central de um registro de arquivo aninhado devem ser usados para indicar o nível de compactação do arquivo aninhado.

O .NET Framework define esses bits ao gerar os arquivos ZIP subjacentes à ZipPackage API. Durante a migração do código do .NET Framework para o .NET, essa funcionalidade foi perdida e, no .NET, os bits 1 & 2 sempre foram definidos para 0 quando novos registros de arquivo foram criados dentro do arquivo ZIP. Essa mudança de quebra restaura essa capacidade. No entanto, os clientes .NET existentes que especificam um CompressionOption quando chamam ZipArchive.CreateEntry verão os valores do sinalizador de bits de uso geral serem alterados.

Comportamento anterior

Anteriormente, o .NET preservou os bits de uso geral para cada ZipArchiveEntry já em um ZipArchive quando foi carregado e novas entradas foram adicionadas. No entanto, a chamada ZipArchive.CreateEntry(String, CompressionLevel) sempre resultou em bits 1 & 2 sendo deixados em um valor padrão de 0, mesmo que um CompressionLevel diferente tenha CompressionLevel.Optimal sido usado.

Esse comportamento teve um efeito downstream: chamar Package.CreatePart(Uri, String, CompressionOption) com qualquer CompressionOption resultou em bits 1 & 2 sendo deixados indefinidos (e, portanto, o CompressionOption foi sempre persistido para o arquivo ZIP como CompressionOption.Normal).

Novo comportamento

A partir do .NET 9, o parâmetro é mapeado CompressionLevel para os sinalizadores de bits de uso geral, conforme indicado na tabela a seguir.

CompressionLevel Bit 1 Bit 2
NoCompression 0 0
Optimal 0 0
SmallestSize 1 0
Fastest 1 1

Se você chamar ZipArchive.CreateEntry(String, CompressionLevel) e especificar CompressionLevel.NoCompression, o método de compactação do registro de arquivo aninhado será definido como Stored (em vez do valor padrão de Deflate.)

Os bits de uso geral para ZipArchiveEntry registros que já existem em um ZipArchive ainda são preservados se um novo ZipArchiveEntry for adicionado.

Os CompressionOption valores de enumeração em Package.CreatePart(Uri, String, CompressionOption) são mapeados para CompressionLevel (e resultam na definição dos bits correspondentes), conforme mostrado na tabela a seguir.

CompressionOption CompressionLevel
NotCompressed NoCompression
Normal Optimal
Maximum SmallestSize (.NET Framework)
Optimal (.NET)
Fast Fastest
SuperFast Fastest

Versão introduzida

.NET 9 Visualização 5

Tipo de mudança de rutura

Esta mudança é uma mudança comportamental.

Razão para a alteração

Essa alteração de quebra foi introduzida para restaurar o comportamento existente do .NET Framework, que foi omitido do .NET no ponto de portabilidade. Essa alteração também dá aos clientes downstream (como System.IO.Packaging) controle sobre o valor desses bits.

Se você quiser garantir que os novos ZipArchiveEntry registros adicionados ao tenham sinalizadores de bits de uso geral de 0, especifique um CompressionLevel de CompressionLevel.Optimal ou CompressionLevel.NoCompression quando você chamar ZipArchive.CreateEntry(String, CompressionLevel).ZipArchive

Se você usar Package.CreatePart(Uri, String, CompressionOption) para adicionar peças a um pacote OPC, especifique um CompressionOption de CompressionOption.NotCompressed ou CompressionOption.Normal.

APIs afetadas