Forum: PC-Programmierung C# ZipArchiv Bug?


von Mike M. (mikeii)


Lesenswert?

Hallo,

ich versuche mit einer StoreApp ein ZipArchiv zu erstellen. Das ist auch 
überhaupt kein Problem, nur wenn ich im Speichern Dialog eine vorhandene 
ZipDatei auswähle, wird diese ab und zu nicht korrekt abgespeichert. 
Teile der Datei sind dann beschädigt. Aber ich Öffne die Datei nicht zum 
Updaten, sondern diese wird durch eine komplett neue ersetzt, zumindest 
will ich das.
1
FileSavePicker savePicker = new FileSavePicker();
2
            savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
3
            // Dateiendung festlegen
4
            savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".zip" });
5
            // Standartdateiname festlegen
6
            savePicker.SuggestedFileName = "export";
7
            StorageFile file = await savePicker.PickSaveFileAsync();
8
            
9
            using (ZipArchive zz = new ZipArchive(await file.OpenStreamForWriteAsync(), ZipArchiveMode.Create,false))
10
            {
11
               
12
                //Einträge hinzufügen, Code irrelevant, funktioniert
13
14
15
            }

Hab ich da was falsch gemacht, oder gibt es da einen Bug oder ähnliches?
Wie gesagt, ich kann 1000 mal die Datei so speichern, und sie ist in 
Ordnung. Aber überschreibe ich eine, kommt ab und zu ein Fehler vor...

von Borislav B. (boris_b)


Lesenswert?

Mal ne dumme Frage:
Warum löschst du die Datei nicht einfach, falls sie schon existiert?

von Z. (Gast)


Lesenswert?

Meine erste Vermutung wäre, dass der neue Datensatz kleiner ist, als der 
alte. Beim Schreiben in den Stream der alten Datei, hat man dann den 
Rest der alten Datei auch in der neuen Datei, was dann die Fehler beim 
Öffnen verursachen könnte.
Daher in einen neuen Stream schreiben oder den alten mit 
System.IO.Stream.SetLength() auf die richtige Grösse stutzen (wenn man 
die neue Länge hat; eventuell von der Position ablesbar) oder 
SetLength(0) schon vor dem Speichern aufrufen oder oder oder... :)

von mikeii (Gast)


Lesenswert?

Das mit dem Stream klingt logisch, das wird es wohl auch sein, da das 
defekte Ziparchiv tatsächlich noch ein Anhängsel hat, das nicht da sein 
sollte

von mikeii (Gast)


Lesenswert?

Zu früh auf senden gedrückt...
Danke dir vielmals :)

von Mike M. (mikeii)


Lesenswert?

@Z.

Den Stream auf die Länge der Aktuellen Position +1 zu setzten hat die 
Lösung gebracht, danke nochmal

von Arc N. (arc)


Lesenswert?

Vielleicht noch eine kleine Änderung (falls beim Schreiben etwas schief 
läuft):
Zuerst die alte Datei umbenennen und diese erst nach dem erfolgreichen 
Schreiben der neuen Datei löschen...

von Mike M. (mikeii)


Lesenswert?

Hi, danke für den Tipp, aber die alte Datei darf ruhig gekillt werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.