使用WebClient实现文件下载

WebClient 类提供向 URI 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法。

WebClient 类使用 WebRequest 类提供对资源的访问。WebClient 实例可以通过任何已向 WebRequest.RegisterPrefix 方法注册的 WebRequest 子代访问数据。

注意

默认情况下,.NET Framework 支持以 http:、https:、ftp:、和 file: 方案标识符开头的 URI。

下面描述用于将数据上载到资源的 WebClient 方法:

  • OpenWrite 检索一个用于将数据发送到资源的 Stream。
  • OpenWriteAsync 检索 Stream,它在不阻止调用线程的情况下将数据发送到资源。
  • UploadData 将字节数组发送到资源,并返回包含任何响应的 Byte 数组。
  • UploadDataAsync 在不阻止调用线程的情况下,将 Byte 数组发送到资源。
  • UploadFile 将本地文件发送到资源,并返回包含任何响应的 Byte 数组。
  • UploadFileAsync 在不阻止调用线程的情况下,将本地文件发送到资源。
  • UploadValues 将 NameValueCollection 发送到资源,并返回包含任何响应的 Byte 数组。
  • UploadValuesAsync 在不阻止调用线程的情况下,将 NameValueCollection 发送到资源,并返回包含任何响应的 Byte 数组。
  • UploadString 在不阻止调用线程的情况下,将 String 发送到资源。
  • UploadStringAsync 在不阻止调用线程的情况下,将 String 发送到资源。

下面描述从资源下载数据的 WebClient 方法:

  • OpenRead 从资源以 Stream 的形式返回数据。
  • OpenReadAsync 在不阻止调用线程的情况下,从资源返回数据。
  • DownloadData 从资源下载数据并返回 Byte 数组。
  • DownloadDataAsync 在不阻止调用线程的情况下,从资源下载数据并返回 Byte 数组。
  • DownloadFile 从资源将数据下载到本地文件。
  • DownloadFileAsync 在不阻止调用线程的情况下,将数据从资源下载到本地文件。
  • DownloadString 从资源下载 String 并返回 String。
  • DownloadStringAsync 在不阻止调用线程的情况下,从资源下载 String。

您可以使用 CancelAsync 方法取消尚未完成的异步操作。

默认情况下,WebClient 实例不发送可选的 HTTP 报头。如果您的请求需要可选报头,必须将该报头添加到 Headers 集合。例如,要在响应中保留查询,必须添加用户代理报头。此外,如果用户代理标头丢失,服务器可能返回 500(内部服务器错误)。

在 WebClient 实例中,AllowAutoRedirect 设置为 true。

给继承者的说明派生类应调用 WebClient 的基类实现,以确保派生类按预期方式工作。

class MainClass
{
    static WebClient webClient;

    public static void Main (string[] args)
    {
        string url = "http://kc.lenovo.com/SHAREitSetup.exe";

        webClient = new WebClient();

        if (webClient.IsBusy)//是否存在正在进行中的Web请求
        {
            webClient.CancelAsync();
        }
        //为webClient添加事件
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler (webClient_DownloadProgressChanged);
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler (webClient_DownloadFileCompleted);
        //开始下载
        webClient.DownloadFileAsync(new Uri(url), "Qiezi.exe");

        Console.ReadKey ();
    }

    static void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {            
        Console.WriteLine (e.ProgressPercentage.ToString () + "%");
        Console.WriteLine (string.Format ("正在下载文件,完成进度{0}/{1}(字节)"
            , e.BytesReceived
            , e.TotalBytesToReceive));
    }

    static void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        if (e.Cancelled)
            Console.WriteLine ("下载被取消!");
        else
            Console.WriteLine ("下载完成!");
    }

    static void btn_cancel_Click(object sender, EventArgs e)
    {
        webClient.CancelAsync();
        webClient.Dispose();
    }

}

知识共享许可协议
《使用WebClient实现文件下载》 常伟华 创作。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议 | 3.0 中国大陆许可协议进行许可。

站内公告

A PHP Error was encountered

Severity: Core Warning

Message: PHP Startup: zip: Unable to initialize module Module compiled with module API=20060613 PHP compiled with module API=20090626 These options need to match

Filename: Unknown

Line Number: 0

Backtrace: