Condividi tramite


ZipArchive.CreateAsync carica automaticamente le voci di archivio ZIP

ZipArchive.CreateAsync ora carica tutti gli elementi dell'archivio ZIP durante la chiamata al metodo. Questa modifica garantisce che l'accesso alla ZipArchive.Entries proprietà non esegua letture sincrone nel flusso sottostante, allineato ai modelli di programmazione asincroni.

Versione introdotta

.NET 11 Preview 1

Comportamento precedente

In precedenza, quando si creava un ZipArchive usando CreateAsync, l'accesso alla proprietà Entries comportava l'esecuzione di operazioni di lettura sincrone (blocking) sul flusso sottostante. Questo comportamento non era coerente con la natura asincrona del CreateAsync metodo e poteva causare problemi con i flussi che non supportano letture sincrone.

using System.IO;
using System.IO.Compression;

using var stream = new FileStream("archive.zip", FileMode.Open);
using var archive = await ZipArchive.CreateAsync(stream, ZipArchiveMode.Read);

// This call performs synchronous reads on the stream.
// Might throw if the file entries are malformed
// or if the stream doesn't support synchronous reads.
var entries = archive.Entries;

Nuovo comportamento

A partire da .NET 11, la directory centrale dell'archivio ZIP viene letta in modo asincrono come parte della chiamata del metodo ZipArchive.CreateAsync. Tutte le eccezioni correlate alle voci in formato non valido o ai problemi di lettura della directory centrale vengono ora generate durante la CreateAsync chiamata. L'accesso Entries successivo alla proprietà non esegue operazioni di lettura sul flusso sottostante.

using System.IO;
using System.IO.Compression;

using var stream = new FileStream("archive.zip", FileMode.Open);

// This call eagerly loads the ZIP archive entries.
// Any exceptions related to malformed entries are surfaced here.
using var archive = await ZipArchive.CreateAsync(stream, ZipArchiveMode.Read);

// Accessing Entries no longer performs stream read operations.
var entries = archive.Entries;

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

Questa modifica è stata apportata per migliorare la coerenza e l'affidabilità durante l'uso di flussi asincroni. Caricamento anticipato delle voci durante la chiamata CreateAsync, l'API evita operazioni di lettura sincrone impreviste in seguito. Evitare letture sincrone è particolarmente importante per i flussi che potrebbero terminare bloccando fino a quando non sono disponibili dati, ad esempio i flussi di rete. Questo è allineato alla progettazione dell'API approvata e offre un'esperienza di programmazione più prevedibile.

Per altre informazioni, vedere dotnet/runtime#121938, dotnet/runtime#121624 e la discussione sulla progettazione dell'API.

Se il codice usa ZipArchive.CreateAsync, assicurati di gestire le eccezioni InvalidDataException dalla chiamata al metodo CreateAsync. Questa eccezione potrebbe essere già generata nelle versioni precedenti di .NET (ad esempio, quando non è possibile trovare la directory centrale ZIP), ma ora viene generata anche per le voci in formato non valido individuate in precedenza solo quando si accede alla Entries proprietà.

Le API interessate