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:
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;
Hier ist der Code für das erstellen der MemoryStreams:
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:
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;
Ich hoffe mir kann jemand helfen!
greetz GeMo