Přidání zipArchiveEntry s compressionLevel nastaví hlavičku centrálního adresáře ZIP pro obecné účely příznaky bitů
Specifikace souboru ZIP definuje, že bity 1 a 2 příznaku pro obecné účely v hlavičce centrálního adresáře záznamu vnořeného souboru by se měly použít k označení úrovně komprese vnořeného souboru.
Rozhraní .NET Framework nastaví tyto bity při generování souborů ZIP podporujících ZipPackage rozhraní API. Během migrace kódu rozhraní .NET Framework do .NET došlo ke ztrátě této funkce a v .NET byly bity 1 a 2 vždy nastaveny, 0
když byly v souboru ZIP vytvořeny nové záznamy souborů. Tato změna způsobující chybu obnoví tuto schopnost. Stávající klienti .NET, kteří zadávají CompressionOption při volání ZipArchive.CreateEntry , se však změní hodnoty příznaku bitu pro obecné účely.
Předchozí chování
Rozhraní .NET dříve zachovalo bity pro obecné účely pro každý ZipArchiveEntry z nich již v ZipArchive době, kdy byla načtena, a byly přidány nové položky. Volání ZipArchive.CreateEntry(String, CompressionLevel) však vždy vedlo k tomu, že bity 1 a 2 zůstaly na výchozí hodnotě 0
, i když CompressionLevel byla použita jiná než CompressionLevel.Optimal použitá.
Toto chování mělo podřízený účinek: volání Package.CreatePart(Uri, String, CompressionOption) s jakýmkoli CompressionOption výsledkem, že bity 1 a 2 zůstaly bez sady (a proto CompressionOption se vždy zachovaly v souboru ZIP jako CompressionOption.Normal).
Nové chování
Počínaje rozhraním .NET 9 CompressionLevel se parametr mapuje na příznaky bitů pro obecné účely, jak je uvedeno v následující tabulce.
CompressionLevel |
Bit 1 | Bit 2 |
---|---|---|
NoCompression |
0 | 0 |
Optimal |
0 | 0 |
SmallestSize |
1 | 0 |
Fastest |
1 | 1 |
Pokud zavoláte ZipArchive.CreateEntry(String, CompressionLevel) a zadáte CompressionLevel.NoCompression, metoda komprese záznamu vnořeného souboru je nastavena na Stored
(místo výchozí hodnoty Deflate
.)
Bity pro obecné účely pro ZipArchiveEntry
záznamy, které již existují v souboru ZipArchive
, zůstanou zachovány, pokud je přidán nový ZipArchiveEntry
.
Hodnoty CompressionOption
Package.CreatePart(Uri, String, CompressionOption) výčtu jsou namapovány na CompressionLevel
(a výsledkem jsou odpovídající bity, které jsou nastaveny), jak je znázorněno v následující tabulce.
CompressionOption |
CompressionLevel |
---|---|
NotCompressed |
NoCompression |
Normal |
Optimal |
Maximum |
SmallestSize (.NET Framework)Optimal (.NET) |
Fast |
Fastest |
SuperFast |
Fastest |
Zavedená verze
.NET 9 Preview 5
Typ zásadní změny
Tato změna je změna chování.
Důvod změny
Tato změna způsobující chybu byla zavedena pro obnovení stávajícího chování rozhraní .NET Framework, které bylo vynecháno z .NET v okamžiku přenosu. Tato změna také dává podřízeným klientům System.IO.Packagingkontrolu nad hodnotou těchto bitů.
Doporučená akce
Chcete-li zajistit, aby nové ZipArchiveEntry
záznamy přidané do ZipArchive
obecných bitových 0
příznaků , zadejte CompressionLevel
nebo CompressionLevel.Optimal
CompressionLevel.NoCompression
při volání ZipArchive.CreateEntry(String, CompressionLevel).
Pokud používáte Package.CreatePart(Uri, String, CompressionOption) k přidání částí do balíčku OPC, zadejte CompressionOption
hodnotu CompressionOption.NotCompressed
nebo CompressionOption.Normal
.