次の方法で共有


CompressionLevel を使用して ZipArchiveEntry を追加すると、ZIP 中央ディレクトリ ヘッダーの汎用ビット フラグが設定される

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