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.
Ação recomendada
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
.