In WinRT abbiamo a disposizione un insieme di classi del namespace System.IO.Compression per gestire e creare file compressi, file ZIP.
La classe principale è ZipArchive, che ci permette di gestire un determinato Stream e gestire, in memoria, la sua compressione.
Nello snippet seguente possiamo vedere un esempio di compressione di più file scelti dall'utente
var picker = new FileOpenPicker(); picker.ViewMode = PickerViewMode.Thumbnail; picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; picker.CommitButtonText = "Completa"; picker.FileTypeFilter.Add(".jpg"); picker.FileTypeFilter.Add(".png"); var filesToZip = await picker.PickMultipleFilesAsync(); var zipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("Compressed.zip", CreationCollisionOption.ReplaceExisting); using (var zipMemoryStream = new MemoryStream()) { using (var zipArchive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create)) { foreach (StorageFile fileToZip in filesToZip) { //converte in byte il buffer var buffer = WindowsRuntimeBufferExtensions.ToArray(await FileIO.ReadBufferAsync(fileToZip)); ZipArchiveEntry zipEntry = zipArchive.CreateEntry(fileToZip.Name, CompressionLevel.Optimal); using (var entryStream = zipEntry.Open()) { //riversa il buffer nello stream dello zip archive entry await entryStream.WriteAsync(buffer, 0, buffer.Length); } } } using (var zipStream = await zipFile.OpenAsync(FileAccessMode.ReadWrite)) { // scrive i dati compressi dalla memoria al file selezionato using (var outstream = zipStream.AsStreamForWrite()) { var buffer = zipMemoryStream.ToArray(); outstream.Write(buffer, 0, buffer.Length); outstream.Flush(); } } } byte[] buffer2; Stream stream = await zipFile.OpenStreamForReadAsync(); buffer2 = new byte[stream.Length]; await stream.ReadAsync(buffer2, 0, (int)stream.Length); var savePicker = new FileSavePicker(); savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; savePicker.FileTypeChoices.Add("Zip", new List<string>() { ".zip" }); savePicker.SuggestedFileName = "NewDocument"; var fileToSave = await savePicker.PickSaveFileAsync(); await FileIO.WriteBytesAsync(fileToSave, buffer2);
Nelle ultime righe di codice dell'esempio possiamo vedere come salvare lo stream compresso sul file system dell'utente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare al massimo i topic space di Event Grid MQTT
Eseguire query verso tipi non mappati in Entity Framework Core
Trasformare qualsiasi backend in un servizio GraphQL con Azure API Management
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Implementare l'infinite scroll con QuickGrid in Blazor Server
.NET Conference Italia 2023
Utilizzare i primary constructor di C# per inizializzare le proprietà
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Eseguire una query su SQL Azure tramite un workflow di GitHub
Short-circuiting della Pipeline in ASP.NET Core
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Utilizzare la session affinity con Azure Container Apps
I più letti di oggi
- Cambiare la chiave di partizionamento di Azure Cosmos DB
- ASP.NET 2.0 per tutti
- Definire stili a livello di libreria in Angular
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- .NET Conference Italia 2023 - Milano e Online
- Come EF 8 ha ottimizzato le query che usano il metodo Contains
- Ottimizzazione dei block template in Angular 17