使用 CompressionLevel 新增 ZipArchiveEntry 會設定 ZIP 中央目錄標頭一般用途位元旗標
ZIP 檔案規格會定義巢狀檔案記錄中央目錄標頭中一般用途位元旗標的位元 1 和 2 應該用來指出巢狀檔案的壓縮層級。
.NET Framework 會在產生支援 ZipPackage API 的 ZIP 檔案時設定這些位元。 在將 .NET Framework 程式碼移轉至 .NET 期間,這項功能遺失,而且在 .NET 中,在 ZIP 檔案中建立新檔案記錄時,位元 1 和 2 一律會設定為 0
。 這項中斷性變更會還原該功能。 不過,呼叫 ZipArchive.CreateEntry 時指定 CompressionOption 的現有 .NET 用戶端將會看到一般用途位元旗標值變更。
先前的行為
先前當已在 ZipArchive 中的每個 ZipArchiveEntry 載入並新增新項目時,.NET 會保留其一般用途位元。 不過,呼叫 ZipArchive.CreateEntry(String, CompressionLevel) 一律會導致位元 1 和 2 保留為預設值 0
,即使使用 CompressionLevel.Optimal 以外的 CompressionLevel 也一樣。
此行為具有下游效果:呼叫具有任何 CompressionOption 的 Package.CreatePart(Uri, String, CompressionOption) 會導致位元 1 和 2 保持未設定 (因此 CompressionOption 一律會保存至 ZIP 檔案,如 CompressionOption.Normal)。
新的行為
從 .NET 9 開始,CompressionLevel 參數會對應至一般用途位元旗標,如下表所示。
CompressionLevel |
位元 1 | 位元 2 |
---|---|---|
NoCompression |
0 | 0 |
Optimal |
0 | 0 |
SmallestSize |
1 | 0 |
Fastest |
1 | 1 |
如果您呼叫 ZipArchive.CreateEntry(String, CompressionLevel) 並指定 CompressionLevel.NoCompression,巢狀檔案記錄的壓縮方法會設定為 Stored
(而不是預設值 Deflate
。)
新增 ZipArchiveEntry
時,仍會保留已存在於 ZipArchive
中之 ZipArchiveEntry
記錄的一般用途位元。
Package.CreatePart(Uri, String, CompressionOption) 中的 CompressionOption
列舉會對應至 CompressionLevel
(並導致設定的對應位元),如下表所示。
CompressionOption |
CompressionLevel |
---|---|
NotCompressed |
NoCompression |
Normal |
Optimal |
Maximum |
SmallestSize (.NET Framework)Optimal (.NET) |
Fast |
Fastest |
SuperFast |
Fastest |
導入的版本
.NET 9 Preview 5
中斷性變更的類型
此變更為行為變更。
變更原因
引進這項中斷性變更來還原現有的 .NET Framework 行為,這是在移植時從 .NET 省略的行為。 這項變更也會讓下游用戶端 (例如 System.IO.Packaging) 控制這些位元的值。
建議的動作
如果您想要確保新增至 ZipArchive
的新 ZipArchiveEntry
記錄具有 0
的一般用途位元旗標,請在呼叫 ZipArchive.CreateEntry(String, CompressionLevel) 時指定 CompressionLevel.Optimal
或 CompressionLevel.NoCompression
的 CompressionLevel
。
如果您使用 Package.CreatePart(Uri, String, CompressionOption) 將組件新增至 OPC 套件,請指定 CompressionOption.NotCompressed
或 CompressionOption.Normal
的 CompressionOption
。