Delen via


Als u een ZipArchiveEntry met CompressionLevel toevoegt, worden bitvlagmen voor algemeen gebruik ingesteld in ZIP Central

De specificatie van het ZIP-bestand definieert dat bits 1 & 2 van de vlag voor algemeen gebruik in de centrale mapheader van een geneste bestandsrecord moeten worden gebruikt om het compressieniveau van het geneste bestand aan te geven.

.NET Framework stelt deze bits in bij het genereren van de ZIP-bestanden die onder de ZipPackage API liggen. Tijdens de migratie van .NET Framework-code naar .NET is deze functionaliteit verloren gegaan en in .NET zijn bits 1 &2 altijd ingesteld op 0 het moment dat er nieuwe bestandsrecords in het ZIP-bestand zijn gemaakt. Met deze wijziging die fouten veroorzaken, wordt die mogelijkheid hersteld. Bestaande .NET-clients die een CompressionOption aanroepen ZipArchive.CreateEntry opgeven, zien echter dat de vlagwaarden voor algemeen gebruik worden gewijzigd.

Vorig gedrag

Voorheen bleef .NET de bits voor algemeen gebruik behouden voor elke ZipArchiveEntry al in een ZipArchive toen deze werd geladen en werden nieuwe vermeldingen toegevoegd. Aanroepen ZipArchive.CreateEntry(String, CompressionLevel) hebben echter altijd geresulteerd in bits 1 & 2 die achterblijven op een standaardwaarde van 0, zelfs als een CompressionLevel andere waarde dan CompressionLevel.Optimal is gebruikt.

Dit gedrag had een downstream-effect: het aanroepen Package.CreatePart(Uri, String, CompressionOption) met een CompressionOption resultaat dat bits 1 & 2 ongeset werd gelaten (en dus het CompressionOption was altijd behouden in het ZIP-bestand als CompressionOption.Normal).

Nieuw gedrag

Vanaf .NET 9 wordt de CompressionLevel parameter toegewezen aan de bitvlagmen voor algemeen gebruik, zoals aangegeven in de volgende tabel.

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

Als u aanroept ZipArchive.CreateEntry(String, CompressionLevel) en opgeeft CompressionLevel.NoCompression, wordt de compressiemethode van de geneste bestandsrecord ingesteld op Stored (in plaats van de standaardwaarde van Deflate.)

De bits voor algemeen gebruik voor ZipArchiveEntry records die al in een ZipArchive bestaan, blijven behouden als er een nieuwe ZipArchiveEntry wordt toegevoegd.

De CompressionOption opsommingswaarden Package.CreatePart(Uri, String, CompressionOption) worden toegewezen aan CompressionLevel (en resulteren in de bijbehorende bits die worden ingesteld) zoals wordt weergegeven in de volgende tabel.

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

Versie geïntroduceerd

.NET 9 Preview 5

Type wijziging die fouten veroorzaken

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze belangrijke wijziging is geïntroduceerd om het bestaande .NET Framework-gedrag te herstellen, dat is weggelaten uit .NET op het punt van de overdracht. Deze wijziging geeft ook downstreamclients (zoals System.IO.Packaging) controle over de waarde van deze bits.

Als u ervoor wilt zorgen dat er nieuwe ZipArchiveEntry records worden toegevoegd aan de ZipArchive algemene bitsvlagmen, 0geeft u een CompressionLevel van CompressionLevel.Optimal of CompressionLevel.NoCompression wanneer u aanroept ZipArchive.CreateEntry(String, CompressionLevel).

Als u Package.CreatePart(Uri, String, CompressionOption) onderdelen toevoegt aan een OPC-pakket, geeft u een CompressionOption ofCompressionOption.NormalCompressionOption.NotCompressed.

Betrokken API's