[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);
        }

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




Sie können dieselbe Idee nur in umgekehrter Reihenfolge verfolgen, indem Sie den Dateistrom wie Quelle verwenden. Ich habe das Formular unten gemacht und die Datei wurde normal geöffnet:

string fileFormat = ".zip"; // any format
string filename = "teste" + fileformat;

StorageFile zipFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename,CreationCollisionOption.ReplaceExisting);

using (Stream zipStream = await zipFile.OpenStreamForWriteAsync()){

   using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create)){
        //Include your content here
   }
}



Links