Dateien Zippen mit Windows 8.1

Zuerst ist die Idee, dann kommen die Probleme. Wenn man es schafft die Probleme in kleine lösbare Tasks aufzubrechen, ist  man quasi schon fertig. Denkt man.

Einer dieser kleinen Tasks ist, mehrere Dateien in ein ZIP File zu legen. In den Windows 8.1 SDK Beispielen findet sich auch ein Beispiel (Compression Sample) um Strings und Streams zu komprimieren. Leider überhaupt nicht passend und auch kaum hilfreich. Der Namensraum System.IO.Compression und eine Methode Compressor. Verschiedene Blog Einträge behaupten, das man damit keine Dateien in ein ZIP komprimieren kann und verweisen auf irgendwelche Nuget Pakete.

Das ist ein neues Problem: wem soll man glauben? (Wie immer ein Problem gelöst, 1+n geschaffen)

Nur der Visual Studio  Object Viewer gibt einen verlässlichen Überblick, der zu 100% stimmt.

image

Gelernt: der Namensraum hat eine Version 4.5.1 und offensichtlich eine Entry Verwaltung (ZipArchiveEntry), was deutlich in Richtung Multi Dateien Zip deutet. Letztendlich kann ein Entry per Open geöffnet und dann eine Datei per Write zum Archiv hinzugefügt werden.

Folgendes Code Beispiel komprimiert zwei HTML Dateien, die im Windows Store APP Projekt Paket inkludiert sind, in eine ZIP Datei und speichert diese im temporären Verzeichnis auf der lokalen Festplatte. Das ist nur Prototyping Code! (refactoring ruft)

   1:Dim dataUri As New Uri("ms-appx:///html/default.html")
   2:Dim file1 As StorageFile = Await StorageFile.GetFileFromApplicationUriAsync(dataUri)
   3:dataUri = New Uri("ms-appx:///html/detail.html")
   4:Dim file2 As StorageFile = Await StorageFile.GetFileFromApplicationUriAsync(dataUri)
   5:Dim storage = 
Await ApplicationData.Current.TemporaryFolder.CreateFileAsync("webcommentbundle.zip")
   6:Using s = Await storage.OpenStreamForWriteAsync()
   7:              Using zip = New ZipArchive(s, ZipArchiveMode.Create)
   8:                  Dim entry = zip.CreateEntry(file1.Name)
   9:                  Using ZipFile = entry.Open()
  10:                      Dim buffer As IBuffer = Await FileIO.ReadBufferAsync(file1)
  11:                      ZipFile.Write(buffer.ToArray, 0, buffer.Length)
  12:                  End Using
  13:                  Dim entry2 = zip.CreateEntry(file2.Name)
  14:                  Using ZipFile = entry2.Open()
  15:                      Dim buffer As IBuffer = Await FileIO.ReadBufferAsync(file2)
  16:                      ZipFile.Write(buffer.ToArray, 0, buffer.Length)
  17:                  End Using
  18:              End Using
  19:End Using
  20:     

Die Write Methode benötigt  ein Byte Array als Parameter. Wir haben Storagefile als Ausgangspunkt und erhalten einen WinRT API typischen iBuffer. Auch hier bringen die Suchmaschinen “Storagefile to Byte Array” die unterschiedlichsten Ergebnisse. Offensichtlich wenig bekannt ist die Methode ToArray (als Extension nachgeliefert)

image

Kommentare sind geschlossen