在.net里关于用Http下载文件,有HttpWebRequest实在是简单。通常用这个组建可以轻松为自己量身定做一个类似于迅雷的下载软件,只要你舍得花这个时间。当然,你还可以从socket方面入手,因为那个比用HTTP实现更底层,操作起来更细腻。但我们现在要说的与那无关,迅雷电驴云云,这些下载软件实在是太方便了,以至于我们看起来毫无写这方面软件的必要了。但是,这方面的资料还是必须掌握一点,在很多方面都会用得着。
当然还没说到正题,先说下实现步骤:1.监视剪切板,判断是否含有可以供下载的链接。2.建立下载任务,实时记录下载进度。 3.进度条显示进度。
先说下迅雷的下载格式:
thunder://QUFodHRwOi8veGlhemFpLnpvbC5jb20uY24vZG93bi5waHA/c29mdGlkPTExNDkyOSZzdWJjYXRpZD0zNDUmc2l0ZT0xMFpathunder://后面一连串的字符串是base64加密而成,因此,我们在下载迅雷协议格式的文件时,必须先解码成Unicode文本。
AAhttp://xiazai.zol.com.cn/down.php?softid=114929&subcatid=345&site=10ZZ去掉 “AA” “ZZ”就是地址了。
准备一下功能函数1.加载已经存在的INI配置文件
/// <summary> /// 为INI文件中指定的节点取得字符串 /// </summary> /// <param name="lpAppName">欲在其中查找关键字的节点名称</param> /// <param name="lpKeyName">欲获取的项名</param> /// <param name="lpDefault">指定的项没有找到时返回的默认值</param> /// <param name="lpReturnedString">指定一个字串缓冲区,长度至少为nSize</param> /// <param name="nSize">指定装载到lpReturnedString缓冲区的最大字符数量</param> /// <param name="lpFileName">INI文件名</param> /// <returns>复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符</returns> [DllImport("kernel32")] public static extern int GetPrivateProfileString( string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); #endregion/// <summary> /// 从INI文件中读取指定节点的内容 /// </summary> /// <param name="section">INI节点</param> /// <param name="key">节点下的项</param> /// <param name="def">没有找到内容时返回的默认值</param> /// <param name="def">要读取的INI文件</param> /// <returns>读取的节点内容</returns> 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文件
/// <summary> /// 修改INI文件中内容 /// </summary> /// <param name="lpApplicationName">欲在其中写入的节点名称</param> /// <param name="lpKeyName">欲设置的项名</param> /// <param name="lpString">要写入的新字符串</param> /// <param name="lpFileName">INI文件名</param> /// <returns>非零表示成功,零表示失败</returns> [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;//记录已完成的大小下面完成下载功能,注释里面都有。最适合初学的人看了。^!^
/// <summary> /// 以断点续传方式下载文件 /// </summary> /// <param name="strFileName">下载文件的保存路径</param> /// <param name="strUrl">文件下载地址</param> 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(); } }这就是最终的效果了。当然迅雷可不是这么简单,要达到迅雷那样的效果火候肯定是不够的。这里面有很多新手值得去学习的地方,这个代码不是我的原创,是我从网上下载后修改完成的。因为我觉得里面确实有很多可以学习鉴戒的地方,因此一时手痒供上给大家了。具体的源码在评论处会补上,欢迎大家下载~!
教程每天都更新,欢迎大家继续关注!
交易流程
发货方式
1、自动:在上方保障服务中标有自动发货的商品,拍下后,将会自动收到来自卖家的商品获取(下载)链接;
2、手动:未标有自动发货的的商品,拍下后,卖家会收到邮件、短信提醒,也可通过QQ或订单中的电话联系对方。
交易周期
1、源码默认交易周期:自动发货商品为1天,手动发货商品为3天,买家有1次额外延长3天交易周期的权利;
2、若上述交易周期双方依然无法完成交易,任意一方可发起追加周期(1~60天)的请求,对方同意即可延长。
退款说明
1、描述:源码描述(含标题)与实际源码不一致的(例:描述PHP实际为ASP、描述的功能实际缺少、版本不符等);
2、演示:有演示站时,与实际源码小于95%一致的(但描述中有"不保证完全一样、有变化的可能性"类似显著声明的除外);
3、发货:手动发货源码,在卖家未发货前,已申请退款的;
4、安装:免费提供安装服务的源码但卖家不履行的;
5、收费:额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外);
6、其他:如质量方面的硬性常规问题等。
注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
注意事项
1、站保站会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全!
2、站保站无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别;
3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外);
4、在没有"无任何正当退款依据"的前提下,商品写有"一旦售出,概不支持退款"等类似的声明,视为无效声明;
5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准);
6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在站保站上所留的QQ、手机号沟通,以防对方不承认自我承诺。
7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于站保站介入快速处理。
站保站声明
1、站保站作为第三方中介平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益;
2、非平台线上交易的项目,出现任何后果均与站保站无关;无论卖家以何理由要求线下交易的,请联系管理举报。
信息加载中,请等待
微信客服(速回)
微信客服(慢回)