作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
谷歌搜索显示了一些关于如何在 Delphi 中下载文件的示例,但大多数都是错误的,并且有一半的时间在我的经验中不起作用。
我正在寻找一个简单而强大的解决方案,它可以让我下载一个 exe(用于更新我的应用程序)并暂停当前更新线程的执行,直到下载完成或出现错误。该过程已经线程化,因此下载代码应该保持执行直到完成(希望如此)。
这里有两个实现,看起来都很复杂
1. http://www.scalabium.com/faq/dct0116.htm
2. http://delphi.about.com/od/internetintranet/a/get_file_net.htm
最佳答案
为什么不使用 Indy?如果使用 TIdHTTP
组件,很简单:
procedure TMyForm.DownloadFile;
var
IdHTTP1: TIdHTTP;
Stream: TMemoryStream;
Url, FileName: String;
begin
Url := 'http://www.rejbrand.se';
Filename := 'download.htm';
IdHTTP1 := TIdHTTP.Create(Self);
Stream := TMemoryStream.Create;
try
IdHTTP1.Get(Url, Stream);
Stream.SaveToFile(FileName);
finally
Stream.Free;
IdHTTP1.Free;
end;
end;
您甚至可以使用 OnWork
和 OnWorkBegin
事件添加进度条:
procedure TMyForm.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64);
begin
ProgressBar.Max := AWorkCountMax;
ProgressBar.Position := 0;
end;
procedure TMyForm.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
ProgressBar.Position := AWorkCount;
end;
procedure TMyForm.DownloadFile;
var
IdHTTP1: TIdHTTP;
Stream: TMemoryStream;
Url, FileName: String;
begin
Url := 'http://www.rejbrand.se';
Filename := 'download.htm';
IdHTTP1 := TIdHTTP.Create(Self);
Stream := TMemoryStream.Create;
try
IdHTTP1.OnWorkBegin := IdHTTPWorkBegin;
IdHTTP1.OnWork := IdHTTPWork;
IdHTTP1.Get(Url, Stream);
Stream.SaveToFile(FileName);
finally
Stream.Free;
IdHTTP1.Free;
end;
end;
我不确定这些事件是否在主线程的上下文中触发,因此对 VCL 组件所做的任何更新可能必须使用 TIdNotify
组件来完成以避免线程问题。也许其他人可以检查一下。
关于windows - 在 Delphi 中下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3506251/
我是一名优秀的程序员,十分优秀!