Пытаюсь организовать загрузку файла (одного файла) в несколько потоков, как, например, в Free Download Manager. Поиски в инете привели к следующему результату:
Код:
type
TDLoad = class(TThread)
private
Strim: TMemoryStream;
{вариант: Strim: TFileStream; - тут пока не ясно}
URL: String;
S, E: Cardinal; //Начальный и конечный байт для скачивания
protected
procedure Execute; override;
public
end;
{ TDLoad }
procedure TDLoad.Execute;
var h: TIdHTTP;
Strim: TMemoryStream;
begin
inherited Execute;
h:=TIdHTTP.Create(nil);
h.HandleRedirects:=True; //задаем
h.Request.UserAgent:= //нужные
h.Request.Referer:= //параметры запроса
h.OnWork:= //здесь можно визуализировать
h.OnWorkBegin:= //процесс с помощью ProgressBar
h.Request.ContentRangeStart:= S; //откуда начинаем закачивать
h.Request.ContentRangeEnd:= E; //где заканчиваем
Strim:= TMemoryStream.Create; //либо это нужно делать далее, в цикле
//и передавать потоку уже созданный TMemoryStream
............................
try
h.Get(URL,Strim); //если все удачно, то в Strim мы имеем кусок нужного файла
Except
on E : Exception do
ShowMessage('Нету'+#13#10+IntToStr(h.ResponseCode));
end;
h.Free;
end;
Дальше более или менее ясно:
запрашиваем размер, делим на части,
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Byte;
dl: TDLoad;
ms: TMemoryStream //Как вариант
begin
.................................
for i:= 0 to {кол-во частей} do
begin
..................................
ms:= TMemoryStream.Create;//вариан
dl:= TDLoad.Create(True);
dl.S:= //задаем начало
dl.E:= //и конец части
dl.Strim:= ms;
end;
...................................
//теперь нужно отловить завершение всех dl: TDLoad
//и собрать все потоки в один файл очевидно понадобится TFileStream
end;
отловить завершение всех потоков я, вероятно, еще сумею, хотя и здесь не откажусь от помощи
а вот как собрать части в один файл не ясно
или есть какая то возможность записывать части сразу в FileStream?