[C#] ZipArchive erstellt ungültige ZIP-Datei


Answers

Auf allen Stream-Objekten müssen Sie die Streams vom Anfang an zurückspulen, damit sie von anderen Anwendungen mit der .Seek-Methode korrekt gelesen werden können.

Beispiel:

zipStream.Seek(0, SeekOrigin.Begin);
Question

Ich versuche, ein neues ZIP-Paket aus Code mit einem Eintrag zu erstellen und das ZIP-Paket in einer Datei zu speichern. Ich versuche, dies mit der System.IO.Compression.ZipArchive- Klasse zu erreichen. Ich erstelle das ZIP-Paket mit dem folgenden Code:

using (MemoryStream zipStream = new MemoryStream())
{
    using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create))
    {
        var entry = zip.CreateEntry("test.txt");
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.WriteLine(
                "Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula.");
        }

Dann speichere ich die ZIP in eine Datei entweder in WinRT:

        var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip", CreationCollisionOption.ReplaceExisting);
        zipStream.Position = 0;
        using (Stream s = await file.OpenStreamForWriteAsync())
        {
            zipStream.CopyTo(s);
        }

Oder in normalen .NET 4.5:

        using (FileStream fs = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
        {
            zipStream.Position = 0;
            zipStream.CopyTo(fs);
        }

Ich kann die produzierten Dateien jedoch weder im Windows Explorer noch in WinRAR usw. öffnen. (Ich habe überprüft, dass die Größe der produzierten Datei der Länge von zipStream entspricht, also wurde der Stream selbst korrekt in der Datei gespeichert.)
Mache ich etwas falsch oder gibt es ein Problem mit der ZipArchive-Klasse?




Der vollständige Code sieht so aus:

var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip",CreationCollisionOption.ReplaceExisting);
using (Stream zipStream = await zipFile.OpenStreamForWriteAsync())
{
    using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
    {
        var entry = zip.CreateEntry("test.txt");
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.WriteLine("Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula.");
        }
    }   
}