ZIP ファイルの仕様では、入れ子になったファイル レコードの中央ディレクトリ ヘッダーの汎用ビット フラグのビット 1 と 2 は、入れ子になったファイルの圧縮レベルを示すために使用しなければならないと定義されています。
.NET Framework は、ZipPackage API を支える ZIP ファイルを生成するときに、これらのビットを設定します。 .NET Framework コードの .NET への移行において、この機能は失われた状態であり、.NET では、ZIP ファイル内に新しいファイル レコードが作成される際には、ビット 1 と 2 は常に 0
に設定されていました。 この破壊的変更によってその機能が復活します。 しかし、CompressionOption の呼び出し時に ZipArchive.CreateEntry を指定する既存の .NET クライアントでは、汎用ビット フラグの値が変更されることになります。
以前の動作
以前は、.NET は、ZipArchiveEntry 内に既に存在するすべての ZipArchive の汎用ビットを、それが読み込まれたときや新しいエントリが追加されたときに保存していました。 しかし、ZipArchive.CreateEntry(String, CompressionLevel) の呼び出しの結果、たとえ 0
ではなく CompressionLevel が使用された場合でも、ビット 1 と 2 は常に既定値である CompressionLevel.Optimal のままとなっていました。
この動作には、何らかの Package.CreatePart(Uri, String, CompressionOption) を使用して CompressionOption を呼び出すと、ビット 1 と 2 が未設定のままとなる (そしてその結果、CompressionOption は常に CompressionOption.Normal として ZIP ファイルに保存される) というダウンストリームへの影響が存在していました。
新しい動作
.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
が追加されても保持されたままとなります。
次の表に示すように、CompressionOption
内の Package.CreatePart(Uri, String, CompressionOption) 列挙型の値は CompressionLevel
にマップされます (その結果、対応するビットが設定されます)。
CompressionOption |
CompressionLevel |
---|---|
NotCompressed |
NoCompression |
Normal |
Optimal |
Maximum |
SmallestSize (.NET Framework)Optimal (.NET) |
Fast |
Fastest |
SuperFast |
Fastest |
導入されたバージョン
.NET 9 Preview 5
破壊的変更の種類
この変更は、動作変更です。
変更理由
この破壊的変更は、移植時に .NET から省かれた既存の .NET Framework の動作を復元するために導入されました。 この変更によって、(System.IO.Packaging などの) ダウンストリーム クライアントもこれらのビットの値を制御できるようになります。
推奨される操作
ZipArchiveEntry
に追加された新しい ZipArchive
レコードが 0
という汎用ビット フラグを持つようにしたい場合は、CompressionLevel
を呼び出すときに、CompressionLevel.Optimal
または CompressionLevel.NoCompression
という ZipArchive.CreateEntry(String, CompressionLevel) を指定します。
Package.CreatePart(Uri, String, CompressionOption) を使用して OPC パッケージにパーツを追加する場合は、CompressionOption
または CompressionOption.NotCompressed
という CompressionOption.Normal
を指定します。
影響を受ける API
.NET