好库网 好库网首页 | 我的好库
好饱的专栏

C#从Web网站下载文件

发布者:好饱
发布日期:2012/5/31 20:33:36   更新日期:2012/8/6 21:24:45
阅读次数:6725
评分:4.80
介绍:展现了如何从任意网站下载文件到本地磁盘或内存。有同步、异步两种方式。
正文:

 

这个例子展现了如何从任意网站下载文件到本地磁盘。下载文件的简单方法是使用WebClient类及其DownloadFile方法。该方法有两个参数,第一个是你想要下载的文件的URL,第二个参数是您要保存文件到本地磁盘的路径。

 

同步方式下载文件

下面的代码演示如何同步方式下载文件。这种方法阻塞主线程,直到该文件被下载完成或发生错误(在这种情况下,将引发WebException)。

 

[C#]

using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://www.okbase.net", @"c:\myfile.txt");

 

 

异步方式下载文件

为了不阻塞主线程可以使用异步方法DownloadFileAsync下载文件。您还可以设置事件处理程序来显示进度,并检测文件是否已经下载完成。

 

源代码如下:

[C#]

private void btnDownload_Click(object sender, EventArgs e)
{
  WebClient webClient = new WebClient();
  webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
  webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
  webClient.DownloadFileAsync(new Uri("http://www.okbase.net/site/about"), @"c:\myfile.txt");
}

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
  progressBar.Value = e.ProgressPercentage;
}

private void Completed(object sender, AsyncCompletedEventArgs e)
{
  MessageBox.Show("Download completed!");
}

 

 

注意:虽然您使用异步方法,但它仍旧会阻塞主线程一段时间。这是因为在异步下载之前,它会检查DNS名称(例如,“okbase.net”),并通过阻塞函数检查内部是否已经完成。如果你直接使用IP,而不是域名,那么DownloadFileAsync方法是完全异步的。

 

下载文件到内存

 

WebClient client = new WebClient();
client.Headers["User-Agent"] =
		"Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " +
		"(compatible; MSIE 6.0; Windows NT 5.1; " +
		".NET CLR 1.1.4322; .NET CLR 2.0.50727)";

// 开始下载
byte[] arrdata = client.DownloadData("http://www.okbase.net");

如果WebClient无法满足您的要求,或需要更深入地定制,你可以考虑一下HttpWebRequest 。

 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。