作者: 乔克斯
查看: 3935|回复: 7
打印 上一主题 下一主题

[源码] 【断点续传】C#下载文件断点续传的类

[复制链接]
跳转到指定楼层
楼主
乔克斯 发表于 2016-6-23 10:44:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 3935|回复: 7
说明:
  • 下载大文件时,中途可能因为各种原因会中断,但是重新下载又太麻烦。以下代码便可以实现断点续传。
  • 要实现断点续传下载文件,首先要了解断点续传的原理。断点续传其实就是在上一次下载断开的位置开始继续下载。
  • HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

这是一个普通的下载请求:
[HTML] 纯文本查看 复制代码
GET /test.txt HTTP/1.1  
Accept:*/*  
Referer:[url=http://192.168.1.96]http://192.168.1.96[/url]  
Accept-Language:zh-cn  
Accept-Encoding:gzip,deflate  
User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727)  
Host:192.168.1.96  
Connection:Keep-Alive  


这表示从1024字节开始断点续传(加入了Range:bytes=1024-):
[HTML] 纯文本查看 复制代码
GET /test.txt HTTP/1.1  
Accept:*/*  
Referer:[url=http://192.168.1.96]http://192.168.1.96[/url]  
Accept-Language:zh-cn  
Accept-Encoding:gzip,deflate  
User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727)  
Host:192.168.1.96  
Range:bytes=1024-  
Connection:Keep-Alive  


源码:
[C#] 纯文本查看 复制代码
#region 以断点续传方式下载文件  
  
/// <summary>  
/// 以断点续传方式下载文件  
/// </summary>  
/// <param name="strFileName">下载文件的保存路径</param>  
/// <param name="strUrl">文件下载地址</param>  
public void DownloadFile(string strFileName, string strUrl)  
{  
    //打开上次下载的文件或新建文件  
    long SPosition = 0;  
    FileStream FStream;  
    if (File.Exists(strFileName))  
    {  
        FStream = File.OpenWrite(strFileName);  
        SPosition = FStream.Length;  
        FStream.Seek(SPosition, SeekOrigin.Current);//移动文件流中的当前指针  
    }  
    else  
    {  
        FStream = new FileStream(strFileName, FileMode.Create);  
        SPosition = 0;  
    }  
    try  
    {  
        HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl);  
        if (SPosition > 0)  
            myRequest.AddRange((int)SPosition);//设置Range值  
        //向服务器请求,获得服务器的回应数据流  
        Stream myStream = myRequest.GetResponse().GetResponseStream();  
        byte[] btContent = new byte[512];  
        int intSize = 0;  
        intSize = myStream.Read(btContent, 0, 512);  
        while (intSize > 0)  
        {  
            FStream.Write(btContent, 0, intSize);  
            intSize = myStream.Read(btContent, 0, 512);  
        }  
        FStream.Close();  
        myStream.Close();  
        //文件下载完成  
    }  
    catch  
    {  
        FStream.Close();  
    }  
}  
 
#endregion


案例源码下载:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 转播转播
回复 论坛版权

使用道具 举报

沙发
贱贱的贱贱 发表于 2016-6-23 12:15:20 | 只看该作者
强强强·~·
板凳
忧郁之子 发表于 2016-6-24 18:49:15 | 只看该作者
好东西,谢谢分享,支持了。
地板
liqud 发表于 2016-6-28 08:50:24 | 只看该作者
没想到原理这么简单哈
5#
yi77b 发表于 2016-7-2 00:45:39 | 只看该作者
马克一下~ 感谢
6#
isml 发表于 2016-12-1 13:53:07 | 只看该作者
不错,学习了
7#
xifengcanyue 发表于 2017-1-12 19:25:41 | 只看该作者
厉害了,学习了
8#
Eval 发表于 2017-5-16 10:16:12 | 只看该作者
好东西,谢谢分享,支持了
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-11-16 14:45, Processed in 0.652910 second(s), 32 queries , Gzip On.

快速回复 返回顶部 返回列表