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.
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)