Udostępnij za pośrednictwem


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.

Jeśli chcesz upewnić się, że nowe ZipArchiveEntry rekordy dodane do ZipArchive mają flagi bitów 0ogó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.

Dotyczy interfejsów API