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
Estrarre dati randomici da una lista di oggetti in C#
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Path addizionali per gli asset in ASP.NET Core MVC
Utilizzare gRPC su App Service di Azure
Ottimizzazione dei block template in Angular 17
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Definire stili a livello di libreria in Angular
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Creare una libreria CSS universale: i bottoni
Gestione dei nomi con le regole @layer in CSS