Einzelnen Beitrag anzeigen

GeMo

Registriert seit: 25. Jan 2006
80 Beiträge
 
Delphi 7 Professional
 
#1

Problem mit Dateigrösse nach SplitDownload (Indy HTTP)

  Alt 25. Jan 2006, 12:57
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
  Mit Zitat antworten Zitat