使用Indy下载文件时从头开始分配全尺寸

The*_*ude 3 delphi indy download delphi-2010 indy10

我有这个delphi代码,基本上下载一个文件(使用Delphi 2010 + Indy 10.5.8 r4743),一切正常,但是当我下载100Mb(例如)时,似乎 Indy分配了完整的大小(即a.立即创建具有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
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法避免indy的这种行为?我知道我可以使用OnWork事件,但是我需要跟踪文件名.

理想情况下,我也想避免使用IPC(有点矫枉过正+我不想使用它,说每一秒,对于多次下载,我更喜欢使用文件大小作为下载进度的指示,因为它提供了更多自由更新UI时)

(*)我认为它是虚拟内容,因为我需要在目前的互联网连接速度60-100秒之间才能真正获得文件

Rem*_*eau 5

是的,TIdHTTP如果提前知道大小,则根据HTTP响应标头预先分配完整文件大小.这是一种优化技术.在编写较大的文件时,预先分配文件可避免不必要的文件系统开销,因为文件不必随着时间的推移而不断增长,从而寻找HDD上的可用扇区,从而减慢写入过程.目前无法禁用预分配,它是Indy内部的硬编码行为.因此,依赖文件的实际大小作为进度指示器将不适合您.您将不得不将实际进度信息从后台应用程序传达到主应用程序.