Creare un file ZIP nelle Windows Store app

di Alessio Leoncini, in WinRT 8.1,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi