在Delphi中下载文件

Dai*_*tsu 13 windows delphi winapi download

谷歌搜索显示了一些关于如何在Delphi中下载文件的示例,但大多数都是错误的,有一半的时间根据我的经验不起作用.

我正在寻找一个简单的强大解决方案,让我下载一个exe(用于更新我的应用程序),并将保持当前更新线程的执行,直到下载完成或错误输出.该进程已经过线程化,因此下载代码应该执行直到完成(希望如此).

这里有两个实现,看起来都很复杂
1. http://www.scalabium.com/faq/dct0116.htm
2. http://delphi.about.com/od/internetintranet/a/get_file_net.htm

And*_*and 16

第二种方法是使用WinINet(Windows API的一部分)使用Internet资源的标准方法.我经常使用它,它一直很好用.我从未尝试过的第一种方法.(两者都不"非常复杂".使用Windows API时总会有一些额外的步骤.)

如果你想要一个非常简单的方法,你可以简单地调用UrlMon.URLDownloadToFile.关于下载,你不会得到任何精细控制(根本没有!),但它非常简单.

例:

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

  • 提示:用`ParamStr(0)`替换`Application.ExeName`以删除对`Forms`单元的依赖. (4认同)

Mik*_*lor 16

为什么不利用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;
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用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;
Run Code Online (Sandbox Code Playgroud)

我不确定这些事件是否会在主线程的上下文中触发,因此可能必须使用tidnotify组件对VCL组件进行任何更新以避免线程问题.也许别人可以检查一下.

  • 如果文件很大,您可能需要使用文件流而不是内存流。 (3认同)