gpt4 book ai didi

delphi - 使用 Indy 下载文件时从一开始就指定完整大小

转载 作者:行者123 更新时间:2023-12-03 15:50:41 26 4
gpt4 key购买 nike

我有这个delphi代码,基本上下载一个文件(使用Delphi 2010 + Indy 10.5.8 r4743),一切正常,除了当我下载100Mb(例如)时,看起来 Indy 指定了完整大小(即立即创建了一个具有 100MB 虚拟内容 (*) 的文件),然后下载该文件。

最终,100MB 被正确下载,但由于下载过程是使用隐藏的 EXEecutable 在后台完成的,因此我的代码依赖于临时文件大小来更新主用户界面

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

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

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

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

最佳答案

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

关于delphi - 使用 Indy 下载文件时从一开始就指定完整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com