AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XE - TZipFile.ExtractZipFile - Dateigröße immer 0

Ein Thema von Perlsau · begonnen am 15. Mai 2013 · letzter Beitrag vom 16. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
Perlsau
(Gast)

n/a Beiträge
 
#1

XE - TZipFile.ExtractZipFile - Dateigröße immer 0

  Alt 15. Mai 2013, 23:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#2

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

  Alt 16. Mai 2013, 00:11
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?
Gruß
Cookie

Geändert von cookie22 (16. Mai 2013 um 00:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 16. Mai 2013, 01:05
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

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

  Alt 16. Mai 2013, 01:20
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 ...

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

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 ...
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

Problem gelöst

  Alt 16. Mai 2013, 02:42
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;

Geändert von Perlsau (16. Mai 2013 um 03:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 16. Mai 2013, 04:18
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.
Gruß
Cookie
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 16. Mai 2013, 08:15
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

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

  Alt 16. Mai 2013, 08:16
Du bist mit einer anderen Bibliothek sicher besser beraten.
Meinst du damit anders als System.Zip oder als anders als ZipMaster von DelphiZip?

DelZip ist OK.
Das ist also was anderes als Zipmaster

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

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

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

Danke für die wertvollen Tips
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

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

  Alt 16. Mai 2013, 08:20
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
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#10

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

  Alt 16. Mai 2013, 08:24
ZipMaster = DelZip.

ZipForge ist auch gut. Kostet halt €100.
Gruß
Cookie
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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