Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   XE - TZipFile.ExtractZipFile - Dateigröße immer 0 (https://www.delphipraxis.net/174878-xe-tzipfile-extractzipfile-dateigroesse-immer-0-a.html)

Perlsau 15. Mai 2013 22:51

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:
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;
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.

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.

cookie22 15. Mai 2013 23:11

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?

Uwe Raabe 16. Mai 2013 00:05

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.

Perlsau 16. Mai 2013 00:20

AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
 
Zitat:

Zitat von cookie22 (Beitrag 1215461)
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?

Ich vermute sowas, hab' aber keine Ahnung, wie ich das herausbekommen kann und ob mir das dann auch weiterhilft ...

Zitat:

Zitat von Uwe Raabe (Beitrag 1215462)
Die ZIP-Dateien haben das Extended-Local-Header-Bit gesetzt und damit kann TZipFile leider nicht umgehen.

Offenbar hast du dir eine dieser Zip-Dateien angesehen. Dann muß ich System.Zip wohl erstmal vergessen, schade eigentlich ... :pale:

Zitat:

Zitat von Uwe Raabe (Beitrag 1215462)
Du solltest dich vielleicht nach einer anderen Bibliothek umsehen.

In meiner eigenen IDE hab ich Abbrevia installiert. Doch arbeite ich gerade mal wieder an einem Kunden-PC mit XE2 unter Win7 (statt bei mir zu Hause mit 2009 unter XP), und hier ist mir die Installation von Abbrevia nicht gelungen. Natürlich hatte ich bereits eine kleine Recherche veranstaltet, um eine brauchbare Zip-Bibliothek zu finden, aber noch keine installiert und ausprobiert. Es gibt ja so viele, da könnt' ich die ganze Nacht mit verbringen. Hatte ich doch im Ernst geglaubt, ich schaff' die gestellte Aufgabe heute nacht noch ... Hast du vielleicht gerade eine brauchbare Empfehlung zur Hand :?:

Vielleicht gibt's ja 7Zip für Delphi, das wäre Klasse, 7Zip entpackt eigentlich fast alles ...:stupid:

Perlsau 16. Mai 2013 01:42

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;

cookie22 16. Mai 2013 03:18

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.

Uwe Raabe 16. Mai 2013 07:15

AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
 
Zitat:

Zitat von Perlsau (Beitrag 1215463)
Hast du vielleicht gerade eine brauchbare Empfehlung zur Hand :?:

Ohne da jetzt umfangreiche Vergleiche angestellt zu haben, bin ich seit langem mit ZipForge sehr zufrieden. Kommt ohne externe DLLs aus.

Perlsau 16. Mai 2013 07:16

AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
 
Zitat:

Zitat von cookie22 (Beitrag 1215470)
Du bist mit einer anderen Bibliothek sicher besser beraten.

Meinst du damit anders als System.Zip oder als anders als ZipMaster von DelphiZip?

Zitat:

Zitat von cookie22 (Beitrag 1215470)
DelZip ist OK.

Das ist also was anderes als Zipmaster :|

Zitat:

Zitat von cookie22 (Beitrag 1215470)
Abbrevia auch.

Das hatte ich bereits versucht, erhielt aber Fehlermeldungen beim Installationsversuch unter XE2. Die genauen Meldungen weiß ich nicht mehr ... ich kann hier auch nicht mehr lange machen, bin erstens übermüdet und Scheffe kommt auch demnächst und will an seinen Rechner ...

Zitat:

Zitat von cookie22 (Beitrag 1215470)
Wenn du die 7Zip DLL benutzen willst, schau mal hier:

Das schaue ich mir von zu Hause nachher mal an ... hört sich vielversprechend an :thumb:

Zitat:

Zitat von cookie22 (Beitrag 1215470)
Wenn du die JCL installiert hast, kannst du auch die benutzen. Da gibt es einen Wrapper für die 7Zip DLL.

Die hab ich, das schau ich mir sogar gleich mal an :thumb::thumb:

Danke für die wertvollen Tips :-D

Perlsau 16. Mai 2013 07:20

AW: XE - TZipFile.ExtractZipFile - Dateigröße immer 0
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1215480)
Ohne da jetzt umfangreiche Vergleiche angestellt zu haben, bin ich seit langem mit ZipForge sehr zufrieden. Kommt ohne externe DLLs aus.

Das kann ich sowieso nicht selber entscheiden, aber ich werd' meinen Auftraggeber darauf hinweisen, sobald er eingetroffen ist, vielleicht investiert er ja die 99 Euro ...

Mit Zipmaster scheint's aber auch gut zu funktionieren, und das kostet nix :!:

cookie22 16. Mai 2013 07:24

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 01:42 Uhr.
Seite 1 von 2  1 2      

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