在Delphi下载文件

谷歌search显示了一些关于如何使用Delphi下载文件的例子,但是大多数是错误的,一半的时间不能用我的经验。

我正在寻找一个简单的强大的解决scheme,这将允许我下载一个单一的exe(用于更新我的应用程序),并将保持当前更新线程的执行,直到下载完成或出错。 该进程已经线程化,所以下载代码应该保持执行,直到完成(希望)。

这里有两个实现,都显得非常复杂
1. http://www.scalabium.com/faq/dct0116.htm
http://delphi.about.com/od/internetintranet/a/get_file_net.htm

第二种方法是使用WinINet(Windows API的一部分)使用Internet资源的标准方式。 我用了很多,它一直运行良好。 我从来没有尝试过的第一种方法。 (两者都不是很“复杂”,使用Windows API时总是会有一些额外的步骤)。

如果你想要一个非常简单的方法,你可以简单地调用UrlMon.URLDownloadToFile 。 你不会得到任何好的控制(完全!)关于下载,但它是非常简单的。

例:

 URLDownloadToFile(nil, 'http://www.rejbrand.se', PChar(ExtractFilePath(Application.ExeName) + 'download.htm'), 0, nil); 

为什么不使用indy。 如果你使用TIdHTTP其简单

 procedure 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 IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64); begin ProgressBar.Max := AWorkCountMax; ProgressBar.Position := 0; end; procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin ProgressBar.Position := AWorkCount; end; 

我不确定这些事件是否在主线程的上下文中触发,所以对VCL组件做的任何更新都可能需要使用tidnotify组件来避免线程问题。 也许别人可以检查。