Condividi tramite


L'aggiunta di un oggetto ZipArchiveEntry con CompressionLevel imposta i flag di bit per utilizzo generico dell'intestazione della directory centrale ZIP

La specifica dei file ZIP definisce che i bit 1 e 2 del flag di bit per utilizzo generico nell'intestazione della directory centrale di un record di file annidato devono essere usati per indicare il livello di compressione del file annidato.

.NET Framework imposta questi bit durante la generazione dei file ZIP alla base dell'API ZipPackage. Durante la migrazione del codice di .NET Framework a .NET, questa funzionalità è stata persa e in .NET i bit 1 e 2 sono sempre stati impostati su 0 durante la creazione di nuovi record di file all'interno del file ZIP. Questa modifica che causa un'interruzione ripristina tale funzionalità. I client .NET esistenti che specificano CompressionOption quando si chiama ZipArchive.CreateEntry rileveranno tuttavia la modifica dei valori dei flag di bit per utilizzo generico.

Comportamento precedente

In precedenza .NET conservava i bit per utilizzo generico per ogni ZipArchiveEntry già in un ZipArchive durante il caricamento e durante l'aggiunta di nuove voci. Tuttavia, in seguito alla chiamata a ZipArchive.CreateEntry(String, CompressionLevel) i bit 1 e 2 venivano sempre lasciati impostati su un valore predefinito pari a 0, anche in caso di utilizzo di un CompressionLevel diverso da CompressionLevel.Optimal.

Questo comportamento aveva un effetto downstream: la chiamata a Package.CreatePart(Uri, String, CompressionOption) con qualsiasi CompressionOption comportava l'annullamento dell'impostazione dei bit 1 e 2. CompressionOption veniva pertanto sempre salvato in modo permanente nel file ZIP come CompressionOption.Normal.

Nuovo comportamento

A partire da .NET 9, il parametro CompressionLevel viene mappato ai flag di bit per utilizzo generico, come indicato nella tabella seguente.

CompressionLevel Bit 1 Bit 2
NoCompression 0 0
Optimal 0 0
SmallestSize 1 0
Fastest 1 1

Se si chiama ZipArchive.CreateEntry(String, CompressionLevel) e si specifica CompressionLevel.NoCompression, il metodo di compressione del record di file annidato viene impostato su Stored anziché sul valore predefinito Deflate.

I bit per utilizzo generico per record ZipArchiveEntry già esistenti in un ZipArchive vengono comunque mantenuti se viene aggiunta una nuova ZipArchiveEntry.

I valori di enumerazione CompressionOption in Package.CreatePart(Uri, String, CompressionOption) vengono mappati a CompressionLevel e comportano l'impostazione dei bit corrispondenti, come illustrato nella tabella seguente.

CompressionOption CompressionLevel
NotCompressed NoCompression
Normal Optimal
Maximum SmallestSize (.NET Framework)
Optimal (.NET)
Fast Fastest
SuperFast Fastest

Versione introdotta

.NET 9 Anteprima 5

Tipo di modifica che causa un'interruzione

Questa è una modifica funzionale.

Motivo della modifica

Questa modifica che causa un'interruzione è stata introdotta per ripristinare il comportamento di .NET Framework esistente, omesso da .NET al momento della conversione. Questa modifica fornisce anche ai client downstream, ad esempio System.IO.Packaging, il controllo sul valore di questi bit.

Per assicurarsi che i nuovi record ZipArchiveEntry aggiunti a ZipArchive abbiano flag di bit per utilizzo generico impostati su 0, specificare un CompressionLevel di CompressionLevel.Optimal o CompressionLevel.NoCompression quando si chiama ZipArchive.CreateEntry(String, CompressionLevel).

Se si usa Package.CreatePart(Uri, String, CompressionOption) per aggiungere parti a un pacchetto OPC, specificare un CompressionOption di CompressionOption.NotCompressed o CompressionOption.Normal.

API interessate