XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Wer kennt sich mit TZipFile aus? Ich verwende zum ersten Mal die Unit System.Zip. Meine aktuelle Aufgabe besteht darin, von einer gegebenen URL eine Anzahl Zip-Dateien herunterzuladen, diese zu entpacken und die Zip-Dateien danach wieder zu löschen, so daß nur die Inhalte der Zipdateien im Download-Ordner zurückbleiben. Die Dateinamen befinden sich in einer Datenbanktabelle und werden in der Procedure in eine Stringliste (Listbox) eingelesen. Das ganze geschieht in einer modal aufgerufenen Form.
Das Herunterladen funktioniert einwandfrei, doch beim Entpacken erweisen sich die in den Zip-Dateien enthaltenen Textdateien als fehlerhaft, denn sie besitzen alle keinen Inhalt (Dateigröße = 0). Die String-Variable DownDir ist global privat deklariert und enthält den vom Anwender gewählten Download-Ordner.
Delphi-Quellcode:
Soweit ich die Dokumentation zu System.zip richtig verstanden habe, benötigt die Procedure TZipFile.ExtractZipFile weder Open noch Close, die anderen Extract-Proceduren dagegen schon.
function TForm_Downloads.PostCodeListe_Aktualisieren : String;
Const Suff = '.zip'; VAR i,z : Integer; Datei, UrlBase, UrlText : String; Strom : TFileStream; ZipDatei : TZipFile; begin UrlBase := DatMod.Aset_Benutzer.FieldByName('Zip_Dump').AsString; IF DatMod.GetPostCodeListe(ListBox_Daten.Items) THEN BEGIN z := ListBox_Daten.Count; Label_Anzahl.Caption := IntToStr(z) + ' Dateien werden jetzt heruntergeladen ...'; Application.ProcessMessages; FOR i := 0 TO z-1 DO BEGIN ListBox_Daten.ItemIndex := i; UrlText := UrlBase + ListBox_Daten.Items[i] + Suff; Datei := DownDir + ListBox_Daten.Items[i] + Suff; Try Strom := TFileStream.Create(Datei,fmCreate,fmShareDenyNone); HTTP_Down.Get(UrlText,Strom); Finally FreeAndNil(Strom); End; Application.ProcessMessages; END; ShowMessage('Herunterladen von ' + IntToStr(z) + ' Dateien beendet.'); Label_Anzahl.Caption := IntToStr(z) + ' Dateien werden jetzt entpackt ...'; Application.ProcessMessages; FOR i := 0 TO z-1 DO BEGIN ListBox_Daten.ItemIndex := i; Datei := DownDir + ListBox_Daten.Items[i] + Suff; IF FileExists(Datei) AND (KleineTools.GetFileSize1(Datei) > 0) THEN Try ZipDatei := TZipFile.Create; ZipDatei.ExtractZipFile(Datei,DownDir); // ZipDatei.Open(Datei,zmRead); // ZipDatei.ExtractAll(DownDir); // UrlText := ExtractFileName(Datei); // UrlText wird hier nur deshalb verwendet, weil ich keine weitere String-Variable deklarieren will, der Bezeichner ist ansich irreführend // UrlText := ChangeFileExt(UrlText,'.txt'); // Jetzt enthält UrlText den Namen der zu extrahierenden Textdatei // ZipDatei.Extract(UrlText,DownDir); // ZipDatei.Close; DeleteFile(Datei); Finally FreeAndNil(ZipDatei); End; Application.ProcessMessages; END; ShowMessage('Entpacken von ' + IntToStr(z) + ' Dateien beendet.'); END; end; Die auskommentierten Zeilen stellen weitere Versuche dar, die Zip-Dateien richtig zu entpacken. Doch bei allen Variationen kommen am Ende immer Textdateien mit der Größe 0 heraus. Bei den Zip-Dateien handelt es sich übrigens um PLZ-Dateien der Firma Geonames, die diese Dateien zum freien Download anbietet. |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Es gibt zig Arten von Zip Dateien. Delphi Zip unterstützt AFAIK nur Version 2.0 mit Deflate.
Alles andere wie Zip64, BZIP, LZMA u.s.w. wird von Delphi eh nicht unterstützt. Vielleicht liegt es ja daran. Sind die Zip-Dateien eventuell verschlüsselt? |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Die ZIP-Dateien haben das Extended-Local-Header-Bit gesetzt und damit kann TZipFile leider nicht umgehen. Du solltest dich vielleicht nach einer anderen Bibliothek umsehen.
|
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zitat:
Zitat:
Zitat:
Vielleicht gibt's ja 7Zip für Delphi, das wäre Klasse, 7Zip entpackt eigentlich fast alles ...:stupid: |
Problem gelöst
Die Lösung lautet vorerst (falls Scheffe morgen früh keine Einwände hat) ZipMaster von DelphiZip. Das sind zwei DLLs, je eine für 32bit und 64bit. Installiert wird die ZipMaster-Komponente. Und die scheint alles zu können, was man von einer Zip-Komponente so erwartet ... bis jetzt. Die Benutzung gestaltet sich recht einfach: Dem Property Filename wird der Dateiname des Zipfiles zugewiesen, mit der Funktion Extract werden alle Inhalte extrahiert. Wie man nur ganz bestimmte Files aus dem Archiv herausholt, hab ich noch nicht herausgefunden ...
Delphi-Quellcode:
function TForm_Downloads.PostCodeListe_Aktualisieren : String;
Const Suff = '.zip'; VAR i,z,R,a : Integer; Datei, UrlBase, UrlText : String; Strom : TFileStream; begin UrlBase := DatMod.Aset_Benutzer.FieldByName('Zip_Dump').AsString; IF DatMod.GetPostCodeListe(ListBox_Daten.Items) THEN BEGIN z := ListBox_Daten.Count; Label_Anzahl.Caption := IntToStr(z) + ' Dateien werden jetzt heruntergeladen ...'; Application.ProcessMessages; FOR i := 0 TO z-1 DO BEGIN ListBox_Daten.ItemIndex := i; UrlText := UrlBase + ListBox_Daten.Items[i] + Suff; Datei := DownDir + ListBox_Daten.Items[i] + Suff; Try Strom := TFileStream.Create(Datei,fmCreate,fmShareDenyNone); HTTP_Down.Get(UrlText,Strom); Finally FreeAndNil(Strom); End; Application.ProcessMessages; END; ShowMessage('Herunterladen von ' + IntToStr(z) + ' Dateien beendet.'); Label_Anzahl.Caption := IntToStr(z) + ' Dateien werden jetzt entpackt ...'; Application.ProcessMessages; ZipMast.ExtrBaseDir := DownDir; a := 0; FOR i := 0 TO z-1 DO BEGIN ListBox_Daten.ItemIndex := i; Datei := DownDir + ListBox_Daten.Items[i] + Suff; IF FileExists(Datei) AND (KleineTools.GetFileSize1(Datei) > 0) THEN Try ZipMast.Active := True; ZipMast.ZipFileName := Datei; R := ZipMast.Extract; IF R = 0 THEN BEGIN DeleteFile(Datei); INC(a); END; Finally ZipMast.Active := False; End; Application.ProcessMessages; END; Datei := DownDir + 'readme.txt'; IF FileExists(Datei) THEN DeleteFile(Datei); ShowMessage('Entpacken von ' + IntToStr(a) + ' Dateien beendet.'); END; end; |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Du bist mit einer anderen Bibliothek sicher besser beraten. DelZip ist OK. Abbrevia auch. Wenn du die 7Zip DLL benutzen willst, schau mal hier: http://www.rg-software.de/rg/index.p..._content&id=29
Wenn du die JCL installiert hast, kannst du auch die benutzen. Da gibt es einen Wrapper für die 7Zip DLL. |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zitat:
|
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Danke für die wertvollen Tips :-D |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zitat:
Mit Zipmaster scheint's aber auch gut zu funktionieren, und das kostet nix :!: |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
ZipMaster = DelZip. :)
ZipForge ist auch gut. Kostet halt €100. |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zitat:
|
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
falls Du mal Interesse an 7zip hast, ich arbeite damit:
http://code.google.com/p/d7zip/ ist etwas komplizierter, weil alles per Source passiert, und was ich als Nachteil empfinde: Beim Entpacken musst Du vor dem Öffnen des Archivs wissen ob das ein zip oder 7z Archiv ist und das entsprechende Interface verwenden. Aber als einfach zu integrierende Lösung ganz nett. GRüße |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Hi Lemmy, du meintest:
Zitat:
Zitat:
Code:
Danach würde ich so aus dem Stegreif geschüttelt suchen und bei Fund wissen, daß es eine 7zip-Datei ist.
37 7A BC AF 27 1C 00 03 // oder nur die ersten drei Zeichen: 7z¼
Was mir als erstes auf der Sourceforge-Seite auffiel: Die letzte Version ist vom April 2010 ... Wird also wohl nicht weiterentwickelt. Und da besteht natürlich die "Gefahr", daß es auf neueren IDEs nicht oder nicht richtig läuft. Ansonsten find' ich 7zip als Desktop-Tool einfach Klasse :thumb: Da ich mich aber heute nacht so einfach in ZipMaster einarbeiten konnte, werd' ich wohl erst mal dabei bleiben. Privat benötige ich das ja eher selten, bislang eigentlich gar nicht. Doch für den kleinen "Job", den ich derzeit mache (ein privat begonnenes Projekt, für das ich eine Art Sponsor hier in KA gefunden habe und an dessen Maschine ich nächtens gelegentlich herumcode), mußte ich mich mit dem Zip-Zeug beschäftigen. |
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zitat:
Zitat:
|
AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
Zip Dateien beginnen immer mit:
Code:
Das sind die Initialien des Zip Format Erfinders, Phil Katz. :)
PK
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz