Hinzufügen einer ZipArchiveEntry-Datei mit CompressionLevel legt allgemeine Bit-Flags für zentrale ZIP-Verzeichnisheader fest
Die ZIP-Dateispezifikation definiert, dass Bits 1 und 2 des allgemeinen Bit-Flags in einem zentralen Verzeichnisheader eines geschachtelten Dateidatensatzes verwendet werden sollten, um die Komprimierungsebene der geschachtelten Datei anzugeben.
.NET Framework legt diese Bits beim Generieren der ZIP-Dateien fest, welche die ZipPackage-API zugrunde legen. Während der Migration von .NET Framework-Code zu .NET ging diese Funktionalität verloren und in .NET wurden Bits 1 und 2 immer auf 0
festgelegt, wenn neue Dateidatensätze in der ZIP-Datei erstellt wurden. Diese bahnbrechende Änderung stellt diese Funktion wieder her. Vorhandene .NET-Clients, die beim Aufrufen von ZipArchive.CreateEntry eine CompressionOption angeben, werden jedoch die allgemeinen Bitkennzeichnungswerte geändert.
Vorheriges Verhalten
Zuvor behält .NET die allgemeinen Bits für jede ZipArchiveEntry bereits in einer ZipArchive bei, als sie geladen wurde und neue Einträge hinzugefügt wurden. Das Aufrufen von ZipArchive.CreateEntry(String, CompressionLevel) führte jedoch immer dazu, dass Bits 1 und 2 bei einem Standardwert von 0
verbleiben, auch wenn eine andere CompressionLevel als CompressionLevel.Optimal verwendet wurde.
Dieses Verhalten hatte einen nachgeschalteten Effekt: Das Aufrufen von Package.CreatePart(Uri, String, CompressionOption) mit einem beliebigen CompressionOption führte dazu, dass Bits 1 und 2 nicht festgelegt wurden (und damit die CompressionOption immer als CompressionOption.Normal in der ZIP-Datei beibehalten wurde).
Neues Verhalten
Ab .NET 9 wird der CompressionLevel-Parameter den allgemeinen Bitkennzeichnungen zugeordnet, wie in der folgenden Tabelle angegeben.
CompressionLevel |
Bit 1 | Bit 2 |
---|---|---|
NoCompression |
0 | 0 |
Optimal |
0 | 0 |
SmallestSize |
1 | 0 |
Fastest |
1 | 1 |
Wenn Sie ZipArchive.CreateEntry(String, CompressionLevel) aufrufen und CompressionLevel.NoCompression angeben, wird die Komprimierungsmethode des geschachtelten Dateidatensatzes auf Stored
festgelegt (anstelle des Standardwerts von Deflate
.)
Die allgemeinen Bits für ZipArchiveEntry
Datensätze, die bereits in einem ZipArchive
vorhanden sind, bleiben erhalten, wenn eine neue ZipArchiveEntry
hinzugefügt wird.
Die CompressionOption
-Enumerationswerte in Package.CreatePart(Uri, String, CompressionOption) werden zugeordnet CompressionLevel
(und führen zu den entsprechenden Bits, die festgelegt werden) wie in der folgenden Tabelle dargestellt.
CompressionOption |
CompressionLevel |
---|---|
NotCompressed |
NoCompression |
Normal |
Optimal |
Maximum |
SmallestSize (.NET Framework)Optimal (.NET) |
Fast |
Fastest |
SuperFast |
Fastest |
Eingeführt in Version
.NET 9 Preview 5
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Diese bahnbrechende Änderung wurde eingeführt, um das vorhandene .NET Framework-Verhalten wiederherzustellen, das an der Portierung von .NET ausgelassen wurde. Diese Änderung ermöglicht auch nachgeschalteten Clients (z. B. System.IO.Packaging) die Kontrolle über den Wert dieser Bits.
Empfohlene Maßnahme
Wenn Sie sicherstellen möchten, dass neue ZipArchiveEntry
Datensätze, die der ZipArchive
hinzugefügt wurden, allgemeine Bit-Flags von 0
aufweisen, geben Sie einen CompressionLevel
von CompressionLevel.Optimal
oder CompressionLevel.NoCompression
an, wenn Sie ZipArchive.CreateEntry(String, CompressionLevel) aufrufen.
Wenn Sie Package.CreatePart(Uri, String, CompressionOption) verwenden, um einem OPC-Paket Teile hinzuzufügen, geben Sie eine CompressionOption
von CompressionOption.NotCompressed
oder CompressionOption.Normal
an.