Einzelnen Beitrag anzeigen

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