C#中WebClient实现文件下载实现方案

功能:从特定的URI请求文件(.Net FrameWork目前支持http:、https:和file:标识符开头的URI)。

特点:功能比较简单。

用法:

1、使用WebClient下载文件。

范例一:使用WebClient下载文件,并保存到硬盘上(需要引入System.Net命名空间)。

 代码如下 复制代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
 
namespace Test
{
  class Program
  {
    static void Main(string[] args)
    {
      WebClient client = new WebClient();
      //如果需要下载权限则需要添加下面的权限代码
       //client.Credentials = new NetworkCredential(loginName, loginPwd);
      client.DownloadFile(new Uri("http://www.111cn.net/"), "d://webClient.html");
    }
  }
}

范例二;使用OpenRead()方法返回一个Stream引用。然后把数据提取到内存中(也可调用OpenWrite方法返回一个可写数据流不演示)。

 代码如下 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
 
namespace Test
{
  class Program
  {
    static void Main(string[] args)
    {
      WebClient client = new WebClient();
      using (Stream sw = client.OpenRead("http://www.111cn.net/"))
      {
        using (StreamReader sr = new StreamReader(sw))
        {
          while (sr.ReadLine() != null)
          {
            Console.WriteLine(sr.ReadLine());
            Console.ReadKey();
          }
        }
      }
    }
  }
}

2、使用WebClient上传文件。

可以使用UpLoadFile函数和UpLoadData函数分别上传文件二进制数据。

但是WebClient不能提供身份验证证书,许多站点都不接受没有身份认证的验证证书。

那我们要如何C#实现获取程序实时下载速度

首先,在下载文件的时候,我们不用DownloadFile()方法进行下载,用WebResponse的GetResponseStream()流进行下载,设一个临时储存变量用来保存不断接收的数据。再用一个额外的独立计时器来分别根据时间间隔和临时收到数据量做计算,临时数据接收量在速度计算后会清空。

下面开始代码:

 代码如下 复制代码

string FileTemp=null;                                      //临时储存
private const int SPD_INTERVAL_SEC = 1;                    //时间常量
Stream stream = rps.GetResponseStream();                   //获取服务器响应文件流
byte[] byts = new byte[rps.ContentLength];                 //创建字节数组保存文件流
System.Threading.Timer FileTm = new System.Threading.Timer(SpeedTimer, null, 0, SPD_INTERVAL_SEC*1000);//使用回调函数,每SPD_INTERVAL_SEC秒执行一次
while ((count = stream.Read(byts, 0, 5000)) != 0)
{
 FileTemp += count;      //临时储存长度
 strTemp += count;       //获取已下载文件长度
}
///
///回调方法
///
private void SpeedTimer(object state)
 {
 FileSpeed = FileTemp/SPD_INTERVAL_SEC;   //SPD_INTERVAL_SEC秒下载字节数,
 FileTemp = 0;                            //清空临时储存
 }

整个文件流全部保存在byts字节数组中,可以在循环时,边读边写入。
效果图:

时间: 2024-08-01 14:20:05

C#中WebClient实现文件下载实现方案的相关文章

javascript中CheckBox全选终极方案

  在javascript页面中实现CheckBox或者Radio的选中状态是一件很容易的事情,下面我们来给大家展示下在asp.net中使用javascript中CheckBox全选终极方案,有需要的小伙伴可以参考下. 在我们的程序开发中经常会要用到CheckBox的全选,通常情况下是在一些数据绑定控件中如Gridview等 下面以Repeater为例,在Repeater的header 和item中放入CheckBox控件 . ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14

C#中WebClient使用DownloadString中文乱码的解决办法

原文:C#中WebClient中文乱码的解决办法 第一次尝试:  string question = textBox1.Text.ToString(); WebClient client= new WebClient(); client.Encoding = System.Text.Encoding.GetEncoding("GB2312"); Uri uri = new Uri("http://xxxxxxxxxxxxxx"); textBox1.Text =cl

webclient重复发送-c#中WebClient重复发送请求的问题

问题描述 c#中WebClient重复发送请求的问题 wpf .net4.0环境, 我用按钮,点击执行下面的代码段,点击一次, 发送http请求到指定的url,这个url是我写的服务器端程序 但是为什么我只是点击了一次按钮,服务器端却收到两次同样的请求呢? 而我用ie浏览器的地址框发送同样的url到我的服务器,就是收到一次请求. 也就是说,WebClient会自动发送两次请求,这是什么原理? 如何解决呢? WebClient mo_client = new WebClient(); string

derby-java中Derby的详细配方案

问题描述 java中Derby的详细配方案 java中Derby的详细配方案,求解 搜索了一些方法,全都不对,帮忙看看

王府井Hybris项目中供应商管理平台的蓝图方案

王府井Hybris项目中供应商管理平台的蓝图方案   http://mp.weixin.qq.com/s?__biz=MzIyNjY1Nzg2Nw==&mid=100000006&idx=1&sn=79011b14b15c6f6acc0e5c8efb7f7e2c&chksm=686c52225f1bdb34942bfd8fa6d9014c6be71b275f8da514cef25eb422c2fbfd5766e07146ce&mpshare=1&scene=

laravel 5.3中自定义加密服务的方案详解

前言 本文介绍的是laravel 5.3中自定义加密服务的方案,利用laravel的服务容器,实现自定义加密服务注册(示例是支持长字符串的RSA加密),下面来看看详细的介绍: 创建加密解密服务类 文件地址 /app/Service/Common/CryptService.php 代码如下 下面这个是个人写的支持长字符串的RSA加密类作为示例,自定义加密的话只需更改这个文件的代码就好,其它操作只是为了实现依赖注入. <?php namespace App\Service\Common; class

Android中DownloadManager实现文件下载实例详解

Android中DownloadManager实现文件下载 下载 创建下载链接 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 设置允许下载的网络环境 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); WIFI网络 : DownloadManager.Request.NETWORK_WIFI 移动网

ASP.NET中OutOfMemoryException异常的处理方案

相信做ASP.NET中大型Web应用的人都碰到过OutOfMemoryException这个异常,对于这个问题我研究了很久,在微软的技术文档上也了解过此问题出现的原因,说实话,到目前我仍然没有完美的解决方案,这里只是把我处理该问题的一些经验提出来和大家一起分享,尽可能的避免该问题的发生. 1) 首先,在硬件的配置上,出现该问题的原因我想很多人已经知道了,那就是IIS对于内存的管理存在一些限制,普遍的认识是800M的线程内存使用上限(通过我的一些客户实践证明的确如此,甚至更低...),不管是w3w

iOS中几种数据持久化方案:我要永远地记住你!

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为"沙盒". 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧