Dodawanie pliku ZipArchiveEntry z funkcją CompressionLevel ustawia flagi bitów ogólnego przeznaczenia nagłówka katalogu ZIP
Specyfikacja pliku ZIP definiuje, że bity 1 i 2 flagi bitowej ogólnego przeznaczenia w centralnym nagłówku katalogu rekordu pliku zagnieżdżonego powinny być używane do wskazania poziomu kompresji zagnieżdżonego pliku.
Program .NET Framework ustawia te bity podczas generowania plików ZIP będących podstawą interfejsu ZipPackage API. Podczas migracji kodu .NET Framework do platformy .NET ta funkcja została utracona i na platformie .NET bity 1 i 2 były zawsze ustawione 0
, gdy nowe rekordy plików zostały utworzone w pliku ZIP. Ta zmiana powodująca niezgodność przywraca tę możliwość. Jednak istniejący klienci platformy .NET, którzy określają CompressionOption podczas wywoływania ZipArchive.CreateEntry , zobaczą zmiany wartości flagi bitów ogólnego przeznaczenia.
Poprzednie zachowanie
Wcześniej platforma .NET zachowała bity ogólnego przeznaczenia dla każdego ZipArchiveEntry elementu już w ZipArchive momencie załadowania i dodania nowych wpisów. Jednak wywołanie ZipArchive.CreateEntry(String, CompressionLevel) zawsze powodowało pozostawienie bitów 1 i 2 w wartości domyślnej 0
, nawet jeśli użyto innej CompressionLevel wartości CompressionLevel.Optimal .
To zachowanie miało efekt podrzędny: wywołanie z każdym CompressionOption spowodowało, że bity 1 i 2 zostały pozostawione bez ustawienia (a tym samym CompressionOption zawsze utrwalone w pliku ZIP jako CompressionOption.Normal).Package.CreatePart(Uri, String, CompressionOption)
Nowe zachowanie
Począwszy od platformy .NET 9, CompressionLevel parametr jest mapowany na flagi bitów ogólnego przeznaczenia, jak wskazano w poniższej tabeli.
CompressionLevel |
Bit 1 | Bit 2 |
---|---|---|
NoCompression |
0 | 0 |
Optimal |
0 | 0 |
SmallestSize |
1 | 0 |
Fastest |
1 | 1 |
W przypadku wywołania ZipArchive.CreateEntry(String, CompressionLevel) i określenia CompressionLevel.NoCompressionmetody kompresji zagnieżdżonego rekordu pliku zostanie ustawiona Stored
wartość (zamiast wartości domyślnej Deflate
).
Bity ogólnego przeznaczenia dla ZipArchiveEntry
rekordów, które już istnieją w obiekcie ZipArchive
, są nadal zachowywane, jeśli zostanie dodany nowy ZipArchiveEntry
.
Wartości CompressionOption
wyliczenia w tabeli Package.CreatePart(Uri, String, CompressionOption) są mapowane na CompressionLevel
(i powodują ustawienie odpowiednich bitów), jak pokazano w poniższej tabeli.
CompressionOption |
CompressionLevel |
---|---|
NotCompressed |
NoCompression |
Normal |
Optimal |
Maximum |
SmallestSize (.NET Framework)Optimal (.NET) |
Fast |
Fastest |
SuperFast |
Fastest |
Wprowadzona wersja
.NET 9 (wersja zapoznawcza 5)
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
Ta zmiana powodująca niezgodność została wprowadzona w celu przywrócenia istniejącego zachowania programu .NET Framework, które zostało pominięte z platformy .NET w momencie przenoszenia. Ta zmiana zapewnia również klientom podrzędnym (takim jak System.IO.Packaging) kontrolę nad wartością tych bitów.
Zalecana akcja
Jeśli chcesz upewnić się, że nowe ZipArchiveEntry
rekordy dodane do ZipArchive
mają flagi bitów 0
ogólnego przeznaczenia , określ CompressionLevel
wartość CompressionLevel.Optimal
lub CompressionLevel.NoCompression
podczas wywoływania polecenia ZipArchive.CreateEntry(String, CompressionLevel).
Jeśli używasz Package.CreatePart(Uri, String, CompressionOption) polecenia do dodawania części do pakietu OPC, określ CompressionOption
wartość CompressionOption.NotCompressed
lub CompressionOption.Normal
.