Compartir vía


Agregar un ZipArchiveEntry con CompressionLevel establece marcas de bits de encabezado de directorio central ZIP de uso general

La especificación de archivo ZIP define que los bits 1 y 2 de la marca de bits de uso general en el encabezado de directorio central del registro de archivo anidado deben usarse para indicar el nivel de compresión del archivo anidado.

.NET Framework establece estos bits al generar los archivos ZIP que respaldan la API ZipPackage. Durante la migración del código de .NET Framework a .NET, esta funcionalidad se perdió y, en .NET, los bits 1 y 2 siempre se establecieron en 0 cuando se crearon nuevos registros de archivo dentro del archivo ZIP. Este cambio importante restaura esa funcionalidad. Sin embargo, los clientes .NET existentes que especifican una CompressionOption al llamar a ZipArchive.CreateEntry verán que los valores de marca de bits de uso general cambian.

Comportamiento anterior

Anteriormente, .NET conservaba los bits de uso general para cada una de las ZipArchiveEntry que ya estaban en un ZipArchive al momento en el que se cargaba y se agregaban nuevas entradas. Sin embargo, la llamada a ZipArchive.CreateEntry(String, CompressionLevel) siempre dio como resultado que los bits 1 y 2 se dejara en un valor predeterminado de 0, incluso si se usó un valor CompressionLevel distinto de CompressionLevel.Optimal.

Este comportamiento tuvo un efecto de bajada: la llamada a Package.CreatePart(Uri, String, CompressionOption) con cualquier CompressionOption daba como resultado que los bits 1 y 2 se dejaran sin establecer (y, por tanto, CompressionOption siempre se conservaba en el archivo ZIP como CompressionOption.Normal).

Comportamiento nuevo

A partir de .NET 9, el parámetro CompressionLevel se asigna a las marcas de bits de uso general, como se indica en la tabla siguiente.

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

Si llama a ZipArchive.CreateEntry(String, CompressionLevel) y especifica CompressionLevel.NoCompression, el método de compresión del registro de archivo anidado se establece en Stored (en lugar del valor predeterminado de Deflate).

Los bits de uso general de los registros ZipArchiveEntry que ya existen en un ZipArchive se conservan si se agrega una nueva ZipArchiveEntry.

Los valores de enumeración CompressionOption de Package.CreatePart(Uri, String, CompressionOption) se asignan a CompressionLevel (y dan como resultado que se establezcan los bits correspondientes), como se muestra en la tabla siguiente.

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

Versión introducida

.NET 9, versión preliminar 5

Tipo de cambio importante

Este es un cambio de funcionamiento.

Motivo del cambio

Este cambio importante se introdujo para restaurar el comportamiento de .NET Framework existente, que se omitió de .NET en el punto de portabilidad. Este cambio también proporciona a los clientes de bajada (como System.IO.Packaging) el control sobre el valor de estos bits.

Si desea asegurarse de que los nuevos registros ZipArchiveEntry agregados a ZipArchive tienen marcas de bits de uso general de 0, especifique un CompressionLevel de CompressionLevel.Optimal o CompressionLevel.NoCompression al llamar a ZipArchive.CreateEntry(String, CompressionLevel).

Si usa Package.CreatePart(Uri, String, CompressionOption) para agregar elementos a un paquete OPC, especifique una CompressionOption de CompressionOption.NotCompressed o CompressionOption.Normal.

API afectadas