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
Velocizzare l'installazione delle dipendenze in un workflow di GitHub
Un confronto tra Framework CSS: Foundation, Bulma, TailwindCSS e SemanticUI
Ottimizzare la concorrenza dinamicamente con le Azure Function
Nullish coalescing e decostruzione in JavaScript
Certificati TLS gestiti con Azure API Management
Installazione di una PWA Blazor
Utilizzare i metodi Linq MinBy e MaxBy per semplificare le ricerche degli elementi minimi e massimi in liste di oggetti complessi con LINQ
Gestire gli errori in un servizio gRPC di ASP.NET Core
Creare un'istanza di Azure Service Bus con ARM
GitHub Actions e Terraform: l'infrastruttura, dalla definizione al deploy
Code generator con C#
Commentare una issue associata ad una pull request tramite un workflow di GitHub