Partager via


L’ajout d’un ZipArchiveEntry avec CompressionLevel définit les indicateurs de bits à usage général d’en-tête de répertoire central ZIP

La spécification du fichier ZIP définit que les bits 1 et 2 de l’indicateur de bit à usage général dans l’en-tête de répertoire central d’un enregistrement de fichier imbriqué doivent être utilisés pour indiquer le niveau de compression du fichier imbriqué.

.NET Framework définit ces bits lors de la génération des fichiers ZIP qui soutiennent l’API ZipPackage. Lors de la migration du code .NET Framework vers .NET, cette fonctionnalité a été perdue et dans .NET, les bits 1 et 2 ont toujours été définis sur 0 quand de nouveaux enregistrements de fichier ont été créés dans le fichier ZIP. Ce changement cassant restaure cette fonctionnalité. Toutefois, les clients .NET existants qui spécifient un CompressionOption lors de l’appel d’un ZipArchive.CreateEntry verront les valeurs d’indicateur de bits à usage général changer.

Comportement précédent

Auparavant, .NET conservait les bits à usage général pour chaque ZipArchiveEntry déjà présent dans un ZipArchive lorsqu’il était chargé et que de nouvelles entrées étaient ajoutées. Cependant, en appelant ZipArchive.CreateEntry(String, CompressionLevel), les bits 1 et 2 sont toujours laissés à la valeur par défaut 0, même si un CompressionLevel autre que CompressionLevel.Optimal est utilisé.

Ce comportement a eu un effet en aval : en appelant Package.CreatePart(Uri, String, CompressionOption) avec n’importe quelle CompressionOption, les bits 1 et 2 n’étaient pas activés (et la CompressionOption était donc toujours conservée dans le fichier ZIP en tant que CompressionOption.Normal).

Nouveau comportement

À compter de .NET 9, le paramètre CompressionLevel est mappé aux indicateurs de bits à usage général, comme indiqué dans le tableau suivant.

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

Si vous appelez ZipArchive.CreateEntry(String, CompressionLevel) et spécifiez CompressionLevel.NoCompression, la méthode de compression de l’enregistrement de fichier imbriqué est définie sur Stored (au lieu de la valeur par défaut de Deflate).

Les bits à usage général pour les enregistrements ZipArchiveEntry qui existent déjà dans une ZipArchive sont toujours conservés si une nouvelle ZipArchiveEntry est ajoutée.

Les valeurs d’énumération CompressionOption dans Package.CreatePart(Uri, String, CompressionOption) sont mappées à CompressionLevel (et entraînent l’activation des bits correspondants) comme indiqué dans le tableau suivant.

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

Version introduite

.NET 9 Preview 5

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Ce changement cassant a été introduit pour restaurer le comportement existant de .NET Framework, qui a été omis de .NET au moment du portage. Ce changement permet également aux clients en aval (tels que System.IO.Packaging) de contrôler la valeur de ces bits.

Si vous souhaitez vous assurer que les nouveaux enregistrements ZipArchiveEntry ajoutés au fichier ZipArchive ont des indicateurs de bits à usage général de 0, spécifiez un CompressionLevel de CompressionLevel.Optimal ou CompressionLevel.NoCompression lorsque vous appelez ZipArchive.CreateEntry(String, CompressionLevel).

Si vous utilisez Package.CreatePart(Uri, String, CompressionOption) pour ajouter des parties à un package OPC, spécifiez un CompressionOption de CompressionOption.NotCompressed ou CompressionOption.Normal.

API affectées