Freigeben über


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.

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.

Betroffene APIs