![]() |
System.Zip Entpacken einer Datei
Ich nutze folgende Funktion, um eine Datei aus einer Zipdatei zu entpacken. Das klappt in den meisten Fällen gut, aber bei verschiedenen Zip-Dateien kommt die Meldung "Die angegebene Datei wurde nicht gefunden xxxx/xxxx/xxx".
Oder kann es sein, dass System.Zip nicht alle Zipversionen kennt? Die Datei, die ich suche, liegt in einem Unterpfad. Wenn ich eine andere Datei extrahieren will, die in der Root der Zipdatei liegt, gibt es keine Problem. Wenn ich aber die Funktion Zip.ExtractAll nutze, wird die Datei neben allen anderen Dateien sauber extrahiert. Nun wollte ich in System.Zip debuggen. Aber da hält der Debugger nicht an. Kann es damit zu tun haben, dass System.Zip scheibgeschützt unter den Programm Files liegt?
Delphi-Quellcode:
Result := false;
Zip := TZipFile.Create; try try Zip.Open(SrcfName, zmRead); if fNames2Extract.Count > 0 then begin for I := 0 to fNames2Extract.Count -1 do begin s := StringReplace((fNames2Extract[i]), '\', '/', [rfReplaceAll]); //231012-01 //231012-01 //Wenn Datei nicht existiert, müssen wir das mit abfangen try Zip.Extract(s, DstDir, false); //Original except on E: Exception do begin ShowMessage(E.Message + '"' + s + '"'); //211107-01 raise; end; end; end; end; result := true; except ShowMessage('Fehler bei EntzipOneFile'); end; Zip.Close; finally Zip.Free; end; |
AW: System.Zip Entpacken einer Datei
Zitat:
|
AW: System.Zip Entpacken einer Datei
Zitat:
|
AW: System.Zip Entpacken einer Datei
Liste der Anhänge anzeigen (Anzahl: 2)
Das Debuggen in der System.Zip wird wohl sehr schwierig werden. Das werde ich wohl nicht hinbekommen.
Was ich gesehen habe, ist dass im Header unterschiedliche Werte stehen bei Dateien, wo es geht und Dateien, wo es nicht geht, siehe Anhänge. Vielleicht hat einer der Spezialisten hier eine Info, ob man mit den Headerdaten schon sieht, wo es klemmt. Das erste Bild zeigt den Header der Problemdatei. Dort ist der Wert "MadeByVersion" anders als in der Datei, wo es geht. |
AW: System.Zip Entpacken einer Datei
Zitat:
![]()
Delphi-Quellcode:
Bis bald...
uses
mormot.core.base, mormot.core.os, mormot.core.zip; begin var zipRead: TZipRead := TZipRead.Create(zipFileName); try var idx: Integer := zipRead.NameToIndex(fileNameToSearch); if (idx >= 0) and zipRead.UnZip(idx, ...) then begin end; finally zipRead.Free; end; Thomas |
AW: System.Zip Entpacken einer Datei
Danke mytbo, aber ich hatte erst von Delphizip auf interne Funktionen umgestellt, da Delphizip meines Wissens nicht mehr weiterentwickelt wurde. Das wäre natürlich später eine Möglichkeit, wenn die internen dann noch nicht gehen.
Ich habe nun einmal die System.Zip lokal in mein Testprojekt kopiert und diese zu Debuggen genommen. Dabei ist mir aufgefallen, dass es Unterschiede in der Speicherung der einzelnen Dateien innerhalb der Zipdatei gibt. Bei den Zipdateiten, wo es nicht funktioniert, ist das Trennzeichen ein Backslash, bei den Zipdateien, wo es funktioniert, ein normaler Slash. Nun stellt sich für mich die Frage, ob das Zipprogramm (ich weiß nicht, wie die Dateien gezipt wurden) nicht nach Vorgabe zusammenpackt, oder ob Delphi hier nicht nach Solldefinition auspackt. Ich könnte bestimmt die System.Zip ändern, aber das wäre nur eine Notlösung. Darf man hier eine Zeile oder zwei aus der System.zip zeigen, wie es funktionieren könnte? Wenn ich in der Funktion TZipFile.IndexOf die Backslahes durch Slashes ersetze, geht es erst einmal. |
AW: System.Zip Entpacken einer Datei
Wäre es möglich eine Beispiel-Zip zu erstellen, die wir hier zum Testen verwenden können?
|
AW: System.Zip Entpacken einer Datei
Uwe, hattest du nicht mal irgendwo die URL der ZIP-Spezifikation?
Evtl. steht da was zu dieser Trennzeichengeschichte drin? |
AW: System.Zip Entpacken einer Datei
|
AW: System.Zip Entpacken einer Datei
Zitat:
|
AW: System.Zip Entpacken einer Datei
Zitat:
Auch kann ich nicht die "schlechte" Datei nehmen und einige Dateien löschen. Sobald ich wieder ein Zipprogramm zum Zippen nehme, wird der Slash eingefügt, Beispiel: V01\compile.log -> bringt Fehler V01/compile.log -> OK, keine Exception Wenn eine Datei in der Root steht, dann klappt alles, da ja der Backslash fehlt. Ich könnte ja den Teil hier posten, weiß aber nicht, ob ich das darf wegen Emba?? Ich weiß bisher nicht, mit welchem Zipprogramm die "schlechten" Dateien gezipt wurden. Das kann ich vielleicht nächste Woche herausfinden, ist aber nicht klar, da hier mehrere Kollegen gezipt haben und einige davon sind sehr kreativ.8-) |
AW: System.Zip Entpacken einer Datei
Zitat:
Auch kann ich nicht die "schlechte" Datei nehmen und einige Dateien löschen. Sobald ich wieder ein Zipprogramm zum Zippen nehme, wird der Slash eingefügt, Beispiel: V01\compile.log -> bringt Fehler V01/compile.log -> OK, keine Exception Wenn eine Datei in der Root steht, dann klappt alles, da ja der Backslash fehlt. Ich könnte ja den Teil hier posten, weiß aber nicht, ob ich das darf wegen Emba?? Ich weiß bisher nicht, mit welchem Zipprogramm die "schlechten" Dateien gezipt wurden. Das kann ich vielleicht nächste Woche herausfinden, ist aber nicht klar, da hier mehrere Kollegen gezipt haben und einige davon sind sehr kreativ.8-) In der o.g. Spezi steht folgender Text drin, d.h. dass das Zipprogramm, was genutzt wurde, nicht der Spezi entspricht oder beim Einlesen des Headers noch etwas verändert wurde. Ich habe bisher nur hier "TZipFile.IndexOf" nachgeschaut und nicht bei Zip.Open. Zitat:
|
AW: System.Zip Entpacken einer Datei
Leider gibt es das oft das Hersteller von tools von standards abweichen! Wer auch immer deine Dateien gezipt hat, hat ein nicht standard konformes tool benutzt.
Ich hatte das mal bei der einem VOIP-CAPI Produkt...nennen wir es YCAPI. Das ist eine CAPI2032.DLL die angeblich ISDN conform den CAPI auf IP telefonie umsetzt. Dann gab es immer weieder mal Abstürze oder unseres auf der CAPI programms wenn es mit YCAPI arbeitete. Stellte sich heraus dass YCAPI nach einer DISCONNECT_B3_IND message trotzdem noch DATA_B3_CONF Messages dieser Connection im speicher ablegte... Eindeutig nicht standard konform!
Code:
Ich habe die Hersteller auf die Seite und die Zeile hingeweisen , wo steht das das nicht geht conformation messages in eine Disconnecteten Verbindung auszuliefern...
(Capi 2.0 Version 5 Seite 44)
Every DATA_B3_REQ results in a corresponding DATA_B3_CONF, with one ex-ception: after transmitting the message DISCONNECT_B3_IND to an application, COMMON-ISDN-API is not allowed to send any other message concerning this log-ical connection. Therefore the application must ensure correct management of re-sources or buffers. die Antwort war "DOCH DAS IST WOHL STANDARD KONFORM"... lol Wir haben dann unser Programm so angepasst das es auch mit nicht standardkonformen CAPI2023.dll implementierungen umgehen kann... Und du musst das vermutlich auch mit den PFADEN machen, damit du Zipdateien von diesen nicht standardkonformen programmen öffnen kannst... Oder machs wie ich und versuch mal solche leute dazu zu bewegen nen Standard durchzulesen... und dann das Programm anzupassen. Wie dem aucch sei mit legacy dateien könnte es ja dann trotzdem nicht funktionieren. |
AW: System.Zip Entpacken einer Datei
Zitat:
Die nicht konformen Dateien stammen wahrscheinlich aus der Zeit, wo man mein Programm nicht genutzt hatte. Da hat wohl jeder einen Zipper gefunden und genutzt. Ich muss nur demnächst einmal prüfen, ob es immer noch Leute gibt, die etwas anderes als mein Programm benutzen. Ist halt einfach, da man die Dateien auch lokal zippen und dann per Explorer auf unser Netzlaufwerk schieben kann. Das kann ich derzeit nicht ändern. Da nun schon etliche Dateien auf dem Netz liegen, muss ich wie oben beschrieben, die Delphi Zip Routine ändern. Es wäre natürlich schön, wenn Emba dies auch machen würde, um kompatibler zu sein. Aber wenn man sich an den Standard hält, hat man ja alles richtig gemacht. Danke für eure Unterstützung. |
AW: System.Zip Entpacken einer Datei
Naja, sobald das neue Bugtracking System in ein paar Tagen verfügbar ist,
könntest du dort ja einen Feature Request dazu reinstellen, ggf. mit Verweis auf diesen Thread bzw. einer Beschreibung dass es solche problematische Zipper gibt. Da wäre es aber vermutlich hilfreich wenn du rausfinden könntest welcher Zipper das macht, dann kann man leichter testen... |
AW: System.Zip Entpacken einer Datei
Zitat:
Zitat:
|
AW: System.Zip Entpacken einer Datei
Zitat:
Leider war das weit verbreitet, weshalb es durchaus Sinn macht, ein Tool zum Entpacken an der Stelle fehlertolerant zu gestalten statt sich streng an den Standard zu halten (auch wenn das natürlich korrekt ist). |
AW: System.Zip Entpacken einer Datei
Ich würde es vorziehen ein Tool zu haben das solche Dateien repariert. Das kann ja auch in einer anderen Programmiersprache gemacht werden und es wäre auch für alle Systeme nutzbar - nicht nur für Delphi Programme ab Version X. Warum soll denn jedes ZIP-lesende Programm auch solche Abweichungen von der Norm verarbeiten können. Das ist doch total unökonomisch. Wenn dann nächsten Monat ein neuer Kandidat mit einer eigenwilligen Interpretation des Standards auftaucht, dann genügt eine neue Version des Tools um das für alle abzudecken. Mit Sicherheit gibt es solche Tools bereits. Man muss nur das geeignete raussuchen. Open Source wäre sicher ein Vorteil.
|
AW: System.Zip Entpacken einer Datei
Zitat:
Und ist das jetz wie mit der Windows C-Api? Verlassen sich jetzt etliche Software Hersteller darauf das der Bug weiter besteht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz