Dela via


Lägga till en ZipArchiveEntry med CompressionLevel ställer in ZIP central katalogrubrik allmänna bitflaggor

ZIP-filspecifikationen definierar att bitar 1 & 2 av flaggan generell användning i en kapslad filposts centrala katalogrubrik ska användas för att ange komprimeringsnivån för den kapslade filen.

.NET Framework anger dessa bitar när zip-filerna som ligger till grund för API:et genereras ZipPackage . Under migreringen av .NET Framework-kod till .NET förlorades den här funktionen och i .NET angavs bit 1 och 2 alltid till 0 när nya filposter skapades i ZIP-filen. Den här icke-bakåtkompatibla ändringen återställer den funktionen. Men befintliga .NET-klienter som anger en CompressionOption när anrop ZipArchive.CreateEntry kommer att se de allmänna bitflaggavärdena ändras.

Tidigare beteende

Tidigare bevarade .NET de allmänna bitarna för varje ZipArchiveEntry redan i en ZipArchive när den lästes in och nya poster lades till. Anropet ZipArchive.CreateEntry(String, CompressionLevel) resulterade dock alltid i att bitar 1 och 2 lämnades med standardvärdet 0, även om ett CompressionLevel annat än CompressionLevel.Optimal användes.

Det här beteendet hade en nedströmseffekt: anrop Package.CreatePart(Uri, String, CompressionOption) med någon CompressionOption resulterade i att bitar 1 och 2 lämnades oet (och därför CompressionOption var alltid sparas till ZIP-filen som CompressionOption.Normal).

Nytt beteende

Från och med .NET 9 mappas parametern CompressionLevel till de allmänna bitflaggor som anges i följande tabell.

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

Om du anropar ZipArchive.CreateEntry(String, CompressionLevel) och anger CompressionLevel.NoCompressionanges komprimeringsmetoden för den kapslade filposten till Stored (i stället för standardvärdet Deflate.)

De allmänna bitarna för ZipArchiveEntry poster som redan finns i en ZipArchive bevaras fortfarande om en ny ZipArchiveEntry läggs till.

Uppräkningsvärdena CompressionOption i Package.CreatePart(Uri, String, CompressionOption) mappas till CompressionLevel (och resulterar i motsvarande bitar som anges) enligt följande tabell.

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

Version introducerad

Förhandsversion 5 av .NET 9

Typ av icke-bakåtkompatibel ändring

Den här ändringen är en beteendeförändring.

Orsak till ändringen

Den här icke-bakåtkompatibla ändringen introducerades för att återställa det befintliga .NET Framework-beteendet, som utelämnades från .NET vid tidpunkten för porteringen. Den här ändringen ger också underordnade klienter (till exempel System.IO.Packaging) kontroll över värdet för dessa bitar.

Om du vill se till att nya ZipArchiveEntry poster som har lagts till ZipArchive har allmänna bitflaggor av 0anger du en CompressionLevel av CompressionLevel.Optimal eller CompressionLevel.NoCompression när du anropar ZipArchive.CreateEntry(String, CompressionLevel).

Om du använder Package.CreatePart(Uri, String, CompressionOption) för att lägga till delar i ett OPC-paket anger du en CompressionOption av CompressionOption.NotCompressed eller CompressionOption.Normal.

Berörda API:er