SharpZipLib: Dateizeiger in einem ZIP bewegen
-
Hallo!
Ich möchte eine Funktion mit SharpZipLib bauen, die 1. ein vorhandenes ZIP-Archiv an Hand der CRC32-Prüfsummen testen soll. Erst wenn alle Einträge überprüft wurden, sollen zusätzlich bestimmte Dateien im ZIP in den Speicher geladen werden.
Der Beispielcode öffnet ein ZIP und führt die CRC-Prüfung für alle enthaltenen Dateien durch. Ich habe die Stelle fett markiert, an der ich zur Postition "1" zurückkehren möchte, damit ich mit "GetNextEntry" die zweite Aufgabe durchführen kann. Die Alternative ist, dass ich das ZIP schließe und erneut öffne. Es geht doch bestimmt auch effizienter, oder?
public bool Testarchive(string pZipFile) { bool rerror = false; byte[] buffer = null; int size = 0; try { FileStream fileStreamIn = new FileStream(pZipFile, FileMode.Open, FileAccess.Read); fileStreamIn.Lock(0, fileStreamIn.Length); ZipInputStream zipInStream = new ZipInputStream(fileStreamIn); Crc32 mcrc = new Crc32(); ZipEntry entry = zipInStream.GetNextEntry(); while (entry != null) { if (entry.IsFile) { buffer = new byte[entry.Size]; size = zipInStream.Read(buffer, 0, buffer.Length); mcrc.Reset(); mcrc.Update(buffer); Console.WriteLine(entry.Name + "\t" + Convert.ToString(entry.Crc, 16) + "\t" + Convert.ToString(mcrc.Value, 16)); if (entry.Crc != mcrc.Value) { Console.WriteLine("\nFile is corrupt: " + pZipFile + " - " + entry.Name + "\n"); rerror = true; break; } } entry = zipInStream.GetNextEntry(); } [b] // Zurück auf das erste Element positionieren... // ??? // ---------------------------------------------[/b] zipInStream.Close(); fileStreamIn.Close(); } catch (Exception Ex) { Console.WriteLine("\n" + pZipFile + "\n" + Ex.Message + "\n"); rerror = true; } return !rerror; }
-
Suchst du
fileStream.Position = 0; // bzw. fileStream.Seek(0, SeekOrigin.Begin);
?
-
Die beiden Dinge hatte ich bereits probiert.
Da kommt dann immer der Fehler:
Auf eine geschlossene Datei kann nicht zugegriffen werden.
-
wieso liest Du das Element nicht einfach aus - packst es in eine MemoryStream und verwendest es dann für das vorgesehene??
-
Ich kann mir das leider nicht aussuchen.
Das Pflichtenheft besagt mit dickem Unterstrich(!),
dass erst alle Dateien geprüft werden sollen und
erst nach dieser Teilaufgabe (die innerhalb einer
Programmschleife erfolgen soll) die weiteren
Arbeitsschritte folgen dürfen. Als Hintergrund wird
hier die bessere Lesbarkeit des Quellcodes benannt.Mir sind also hier die Hände gebunden, ob ich es will oder nicht.
Aber ich denke, dass es schon eine Navigationsmöglichkeit
in ZIP-Dateien geben sollte.
-
Du kannst mit ZipFile.EntryFileNames dir eine Liste aller vorhandener Dateien im Archiv geben lassen. Über die könntest du dann zweimal mit dem Enumerator drüberlaufen, einmal zum verifizieren und einmal zum weiterverarbeiten. Auf eine Datei im Archiv solltest du mit einem Indexer zugreifen können, z.B. myArchive["dir/file.txt"].Extract(<memorystream to extract>).
-
csofti schrieb:
Das Pflichtenheft besagt mit dickem Unterstrich(!),
dass erst alle Dateien geprüft werden sollen und
erst nach dieser Teilaufgabe (die innerhalb einer
Programmschleife erfolgen soll) die weiteren
Arbeitsschritte folgen dürfen.für alle ZIP-Entrys lies aktuelles ZIP-Entry überprüfe den Eintrag pack es in einem MemoryStream/Byte-Array - für später // weiterer Unfug
wo widerspricht das dem Pflichtenheft? ... erzähl was von Rechenleistung - Festplatte das langsamste im Rechner - Festplattenverschleiß (der hier wirklich existiert!) - etc. dem Kunden
Als Hintergrund wird hier die bessere Lesbarkeit des Quellcodes benannt.
was für eine blöde Ausrede des Kunden ... jeder Programmierer hat seine eigene Handschrift ... den Grund im Pflichtenheft kann ich auch unübersichtlich machen
Aber ich denke, dass es schon eine Navigationsmöglichkeit
in ZIP-Dateien geben sollte.ja ... ZIP zu - ZIP auf ... nur wozu der Umweg ... nur gut das Kunden keine Ahnung vom Programmieren haben
hand, mogel
-
mogel schrieb:
csofti schrieb:
Das Pflichtenheft besagt mit dickem Unterstrich(!),
dass erst alle Dateien geprüft werden sollen und
erst nach dieser Teilaufgabe (die innerhalb einer
Programmschleife erfolgen soll) die weiteren
Arbeitsschritte folgen dürfen.für alle ZIP-Entrys lies aktuelles ZIP-Entry überprüfe den Eintrag pack es in einem MemoryStream/Byte-Array - für später // weiterer Unfug
wo widerspricht das dem Pflichtenheft? ... erzähl was von Rechenleistung - Festplatte das langsamste im Rechner - Festplattenverschleiß (der hier wirklich existiert!) - etc. dem Kunden
hand, mogelVon blöde Ausreden vom Kunden würde ich hier nicht reden.
Es geht in einigen Fällen um riesige Datenmengen.
So muss ich es möglichst speicherschonend machen und
kann nicht alle ZIP-Entrys in ein MemoryStream zwischenspeichern.
Ich werde es mit ZIP auf / ZIP zu machen, wenn ich es nicht
so hinbekomme, wie es witte gesagt hat.