![]() |
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 ![]() ![]() |
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)
![]()
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:
![]() 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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 by Thomas Breitkreuz