3

基本的にファイルをダウンロードするこのデルファイコードがあります(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秒かかるため、ダミーコンテンツだと思います。

4

1 に答える 1

5

はい、TIdHTTPHTTP 応答ヘッダーに基づいて事前にサイズがわかっている場合は、ファイル全体のサイズを事前に割り当てます。これは最適化手法です。ファイルを事前に割り当てることで、大きなファイルを書き込む際の不要なファイル システム オーバーヘッドを回避できます。これは、ファイルが時間の経過とともに大きくなり続ける必要がなく、HDD で使用可能なセクターを探して、書き込みプロセスが遅くなるからです。現在、事前割り当てを無効にする方法はありません。これは、Indy の内部でハードコーディングされた動作です。そのため、ファイルの実際のサイズを進行状況インジケーターとして当てにすることはできません。バックグラウンド アプリからメイン アプリに実際の進捗情報を伝える必要があります。

于 2012-05-15T17:08:27.523 に答える