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
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Recuperare App Service cancellati su Azure
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Creare una libreria CSS universale: Cards
Introduzione ai web component HTML
Loggare le query più lente con Entity Framework
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
I più letti di oggi
- Beta 1 di VS 2005 Enterprise Architect
- Point-in-time restore con gli Azure Storage Blob
- Focus dei tag input con HTML5
- Il nuovo tag nav in HTML5
- Evitare la modalità di risparmio energetico in una Windows Store app
- Real Code Day 4.0: costruire applicazioni reali - Firenze
- AI&ML Conference 2019 - Milano
- Mono 0.12: verso una nuova implementazione di ASP.NET