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.