基本的にファイルをダウンロードするこのデルファイコードがあります(Delphi 2010 + Indy 10.5.8 r4743を使用)。100Mbをダウンロードすると(たとえば)、Indyがフルサイズを割り当てているように見えることを除いて、すべてが正常に機能します(つまり、 100MBのダミーコンテンツ(*)を含むファイルが即座に作成されます)、ファイルをダウンロードします。
最終的に100MBは正しくダウンロードされますが、ダウンロードプロセスは非表示のEXEecutableを使用してバックグラウンドで実行されるため、メインUIを更新するために一時ファイルサイズに依存するようにコードを基にしています。
with IdHTTP do
begin
if FileExists(LocalFile) then
iLength := FileSize2(LocalFile)
else
iLength := 0;
DoExit := False;
try
try
repeat
if ExitApp then
Exit;
if Not FileExists(LocalFile) then
AFileStream := TFileStream.Create(LocalFile, fmCreate)
else
begin
// File already exist, resume download
AFileStream := TFileStream.Create(LocalFile, fmOpenReadWrite);
DoExit := (AFileStream.Size >= iLength);
if (Not DoExit) then
AFileStream.Seek(Max(0, AFileStream.Size - 4096), soFromBeginning);
end;
iRangeEnd := AFileStream.Size + 50000;
if (iRangeEnd < iLength) then
Request.Range := IntToStr(AFileStream.Position) + '-' + IntToStr(iRangeEnd)
else
begin
Request.Range := IntToStr(AFileStream.Position) + '-';
DoExit := True;
end;
PostTime := Now;
Get(TheURL, AFileStream);
IsError := Not (ResponseCode in [200, 206]);
until DoExit;
Disconnect;
except
IsError := True;
end; // try/except
finally
FreeAndNil(AFileStream);
end; // try/finally
end; // with
私の質問は、この振る舞いをインディから回避する方法はありますか?OnWorkイベントを使用できることはわかっていますが、ファイル名を追跡する必要があります。
理想的には、IPCも避けたいです(ちょっとやり過ぎ+毎秒、複数のダウンロードには使用したくないので、ダウンロードの進行状況を示すためにファイルサイズを使用する方が自由です。 UIを更新するとき)
(*)実際にファイルを取得するには、現在のインターネット接続速度で60〜100秒かかるため、ダミーコンテンツだと思います。