博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)断点续传下载文件[带进度条类似迅雷]
阅读量:4622 次
发布时间:2019-06-09

本文共 4534 字,大约阅读时间需要 15 分钟。

原文地址:http://www.cnblogs.com/uu102/archive/2012/10/12/2720572.html

 

       在.net里关于用Http下载文件,有HttpWebRequest实在是简单。通常用这个组建可以轻松为自己量身定做一个类似于迅雷的下载软件,只要你舍得花这个时间。当然,你还可以从socket方面入手,因为那个比用HTTP实现更底层,操作起来更细腻。但我们现在要说的与那无关,迅雷电驴云云,这些下载软件实在是太方便了,以至于我们看起来毫无写这方面软件的必要了。但是,这方面的资料还是必须掌握一点,在很多方面都会用得着。

当然还没说到正题,先说下实现步骤:1.监视剪切板,判断是否含有可以供下载的链接。2.建立下载任务,实时记录下载进度。 3.进度条显示进度。

先说下迅雷的下载格式:

thunder://QUFodHRwOi8veGlhemFpLnpvbC5jb20uY24vZG93bi5waHA/c29mdGlkPTExNDkyOSZzdWJjYXRpZD0zNDUmc2l0ZT0xMFpa

thunder://后面一连串的字符串是base64加密而成,因此,我们在下载迅雷协议格式的文件时,必须先解码成Unicode文本。

AAhttp://xiazai.zol.com.cn/down.php?softid=114929&subcatid=345&site=10ZZ

去掉 “AA” “ZZ”就是地址了。


using System.IO;//引入输入输出功能 using System.Net;//网络请求 using System.Text.RegularExpressions;//用于正则表达式字符串处理 using System.Runtime.InteropServices;//引入WinAPI功能函数 using System.Threading;//处理线程

准备一下功能函数

1.加载已经存在的INI配置文件

View Code
///          /// 为INI文件中指定的节点取得字符串         ///          /// 欲在其中查找关键字的节点名称         /// 欲获取的项名         /// 指定的项没有找到时返回的默认值         /// 指定一个字串缓冲区,长度至少为nSize         /// 指定装载到lpReturnedString缓冲区的最大字符数量         /// INI文件名         /// 
复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符
[DllImport("kernel32")] public static extern int GetPrivateProfileString( string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); #endregion
View Code
///          /// 从INI文件中读取指定节点的内容         ///          /// INI节点         /// 节点下的项         /// 没有找到内容时返回的默认值         /// 要读取的INI文件         /// 
读取的节点内容
public static string ReadString(string section, string key, string def, string fileName) { StringBuilder temp = new StringBuilder(1024); GetPrivateProfileString(section, key, def, temp, 1024, fileName); return temp.ToString(); }

2.写入INI文件

View Code
///          /// 修改INI文件中内容         ///          /// 欲在其中写入的节点名称         /// 欲设置的项名         /// 要写入的新字符串         /// INI文件名         /// 
非零表示成功,零表示失败
[DllImport("kernel32")] public static extern int WritePrivateProfileString( string lpApplicationName, string lpKeyName, string lpString, string lpFileName); #endregion

好了,准备工作做完了。先建立几个全局变量。

static string FileName = "";//记录要下载的文件名        static long FileLength = 0; //记录文件大小        static  int CompletedLength = 0;//记录已完成的大小

下面完成下载功能,注释里面都有。最适合初学的人看了。^!^

View Code
///          /// 以断点续传方式下载文件         ///          /// 下载文件的保存路径         /// 文件下载地址         public void DownloadFile(string strFileName, string strUrl)         {             //打开上次下载的文件或新建文件            int CompletedLength = 0;//记录已完成的大小                        FileStream FStream;             if (File.Exists(strFileName))             {                 FStream = File.OpenWrite(strFileName);                 sPosstion = FStream.Length;                 FStream.Seek(sPosstion, SeekOrigin.Current);//移动文件流中的当前指针             }             else             {                 FStream = new FileStream(strFileName, FileMode.Create);                 sPosstion = 0;             }             //打开网络连接             try             {                 HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl);                 if (CompletedLength > 0)                     myRequest.AddRange((int)CompletedLength);//设置Range值                 //向服务器请求,获得服务器的回应数据流                 HttpWebResponse webResponse = (HttpWebResponse)myRequest.GetResponse();                 FileLength = webResponse.ContentLength;//文件大小                 Stream myStream = webResponse.GetResponseStream();                 byte[] btContent = new byte[1024];                if(count<=0) count += sPosstion;                  while ((CompletedLength = myStream.Read(btContent, 0, 1024)) > 0)                 {                     FStream.Write(btContent, 0, CompletedLength);                     count += CompletedLength;                 }                 FStream.Close();                 myStream.Close();                 MessageBox.Show("文件下载完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);             }             catch             {                 FStream.Close();             }         }

这就是最终的效果了。当然迅雷可不是这么简单,要达到迅雷那样的效果火候肯定是不够的。这里面有很多新手值得去学习的地方,这个代码不是我的原创,是我从网上下载后修改完成的。因为我觉得里面确实有很多可以学习鉴戒的地方,因此一时手痒供上给大家了。具体的源码在评论处会补上,欢迎大家下载~!

教程每天都更新,欢迎大家继续关注! 

转载于:https://www.cnblogs.com/fcsh820/archive/2012/10/15/2723753.html

你可能感兴趣的文章
SHELL学习笔记----IF条件判断,判断条件
查看>>
RegisterWaitForSingleObject的使用
查看>>
UML第三次作业
查看>>
000 Python教程
查看>>
2013能量篇终止,2014精致篇起航
查看>>
力扣——分数排名(数据库的题
查看>>
力扣——行程与用户(数据库的题
查看>>
3.java基础语法(下)
查看>>
ios 11 系统CPU过高,xib中textfield使用导致出过高
查看>>
JS应用(资料很全)
查看>>
JAVA 自动生成对应数据库表的JPA代码工具
查看>>
一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符
查看>>
Linux虚拟文件系统VFS解决
查看>>
应用程序配置文件
查看>>
SharePoint 2010 中创建超链接到Pop-Up对话框
查看>>
DataTable.AcceptChanges方法有何用处
查看>>
html之内联标签a
查看>>
利用python和shell脚本生成train.txt的标签文件
查看>>
Nodejs学习总结 -Express 登录注册示例(二)
查看>>
navicat 链接数据库 报1103
查看>>