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.
Action recommandée
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
.