![]() |
Problem mit Dateigrösse nach SplitDownload (Indy HTTP)
hallo zusammen... ich bin neu hier und hab ein kleines Problem!
Mein Programm soll per IdHTTP eine Datei aus dem Internet gesplittet in einen TMemoryStream herunterladen und das ganze am Ende des Downloadprozesses wieder zusammen fügen und in einer Datei speichern. Eigentlich klappt das auch ganz gut, nur dass die Memorystreams immer genau dieselbe größe haben wie der datei auf dem Webserver. Somit wird die Dateigröße am Ende quasi multipliziert mit der Anzahl der Streams. Das ganze läuft bei mir über Downloadthreads und es können maximal 3 Dl-Threads gleichzeitig laufen. Also meine Frage: Wie bekomme ich es hin, dass die heruntergeladene Datei am ende die selbe größe hat, wie die originale Datei? Also wie werden die MemoryStreams kleiner? Der Code:
Delphi-Quellcode:
Hier ist der Code für das erstellen der MemoryStreams:
procedure TDownload.down;
var beg, endo: Int64; xblub : Integer; yblub : Integer; copStream : TMemoryStream; begin xblub := 1; yblub := 1; beg := 0; endo := 0; Form9.IdHTTP.Head(url + datei + endung); bytesIns := Form9.IdHTTP.Response.ContentLength; bytesCop := 0; repeat if(laufendes < 3) then begin Application.ProcessMessages; beg := bytesCop; if (bytesIns-bytesCop) > cFileSplitSize then begin endo := BytesCop+cFileSplitSize; end else endo := BytesIns; Application.ProcessMessages; if(endo-beg >= 0) then begin inc(laufendes); dow[xblub] := TDL.create; dow[xblub].setS(beg); dow[xblub].setE(endo); dow[xblub].ide := xblub; dow[xblub].Resume; inc(xblub); end; //Progress und Status aktualliesieren Application.ProcessMessages; Form9.ProgressBar1.Position := gedownloaded; Form9.Label3.Caption := 'Status: ' + GetSizeName(gedownloaded)+'/'+GetSizeName(BytesIns); BytesCop := BytesCop + cFileSplitSize; end; until (beg >= endo); //Schleife beenden wenn datei fertig while(laufendes > 0) do begin end; lStream := TFileStream.Create(dl, fmCreate); lStream.position := 0; while(yblub < xblub) do begin copStream := dow[yblub].dStream; try copStream.SaveToStream(lstream); finally inc(yblub); copStream.free; end; end; lStream.free; Form9.Label3.Caption := 'Status: 100%'; Form9.Button1.Caption := 'Download'; Form9.ProgressBar1.Position := 0; Form9.Button1.enabled := true; Form9.Button2.enabled := true; Form9.Edit2.Enabled := true; end;
Delphi-Quellcode:
procedure TDL.dl;
begin dStream := TMemoryStream.Create(); dStream.position := 0; Id.get(url + data + endung, dStream); dec(laufendes); gedownloaded := gedownloaded + (Id.Request.ContentRangeEnd - Id.Request.ContentRangeStart); Form9.ProgressBar1.Position := gedownloaded; Form9.Label3.Caption := 'Status: ' + GetSizeName(gedownloaded)+'/'+GetSizeName(BytesIns); Application.ProcessMessages; end; Der Anfangs und Endpunkt für die Streams wird in folgenden Methoden gesetzt (Aufgerufen in TDownload.down):
Delphi-Quellcode:
Ich hoffe mir kann jemand helfen!
procedure TDL.setS(start:Int64);
begin Id.Request.ContentRangeStart := start; st := start; end; procedure TDL.setE(ende:Int64); begin Id.Request.ContentRangeEnd:= ende; en := ende; end; greetz GeMo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 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-2025 by Thomas Breitkreuz