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