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
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Effettuare il refresh dei dati di una QuickGrid di Blazor
Gestire la cancellazione di una richiesta in streaming da Blazor
Utilizzare una qualunque lista per i parametri di tipo params in C#
Fornire parametri ad un Web component HTML
Creare una libreria CSS universale: Immagini
Migliorare la sicurezza dei prompt con Azure AI Studio
Gestione dei nomi con le regole @layer in CSS
Anonimizzare i dati sensibili nei log di Azure Front Door
Utilizzare Hybrid Cache in .NET 9
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Change tracking e composition in Entity Framework