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.
Aanbevolen actie
Als u ervoor wilt zorgen dat er nieuwe ZipArchiveEntry
records worden toegevoegd aan de ZipArchive
algemene bitsvlagmen, 0
geeft 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.Normal
CompressionOption.NotCompressed
.