C#实现文件断点续传下载的方法
本文实例讲述了C#实现文件断点续传下载的方法。分享给大家供大家参考。具体实现方法如下:
usingSystem; usingSystem.Data; usingSystem.Configuration; usingSystem.Web; usingSystem.Web.Security; usingSystem.IO; usingSystem.Text; usingSystem.Net; namespacesimpleDemo { classProgram { ///<summary> ///下载文件保留字 ///</summary> publicstaticstringPERSIST_EXP=".cdel"; ///<summary> publicstaticvoidMain(string[]args) { stringpath="D:\\aa.txt"; stringec=getFileEncoding(path,"GB2312"); print("coding:"+ec); //stringcontent=fileReader(path,Encoding.GetEncoding(ec)); //print(content); //fileWriter(path,"测试内容11",Encoding.GetEncoding(ec)); stringurl="http://www.XXX.com/20120920172200024.flv"; stringpath1="D:\\aa1.flv"; download(url,path1); //gapDownload(url,path1); //t(url); } publicstaticvoidt(stringurl){ HttpWebRequestrequest=(System.Net.HttpWebRequest)HttpWebRequest.Create(url); //WebResponseresponse=httpClient.CreateGetHttpResponse(url,3000,null,null); try{ WebResponseresponse=request.GetResponse(); WebHeaderCollectionheaders=response.Headers; print(response.ContentLength); request=(System.Net.HttpWebRequest)HttpWebRequest.Create(url); request.AddRange(11);//设置Range值 WebResponseresponse1=request.GetResponse(); print(response1.ContentLength); foreach(stringkeyinheaders) { print(key+"-----"+headers.Get(key)); } stringdisposition=headers.Get("Content-Disposition"); print(disposition); }catch(Exceptione){ print(e.Message); } //stringfileName=disposition.Substring(disposition.IndexOf("\"")); //print(fileName); } publicstaticvoiddownload(stringurl,stringpath){ if(File.Exists(path)) { print("文件己存在!是否重新下载?"); return; } else{ path=path+PERSIST_EXP; simpleDownload(url,path);//开始下载 } } ///<summary> ///下载网络资源(支持断点续传) ///</summary> ///<paramname="url"></param> ///<paramname="path"></param> publicstaticvoidsimpleDownload(stringurl,stringpath) { HttpWebRequestrequest=httpClient.getWebRequest(url,0); WebResponseresponse=null; FileStreamwriter=newFileStream(path,FileMode.OpenOrCreate,FileAccess.Write); longlStartPos=writer.Length;;//当前文件大小 longcurrentLength=0; longtotalLength=0;//总大小 if(File.Exists(path))//断点续传 { response=request.GetResponse(); longsTotal=response.ContentLength; if(sTotal==lStartPos){ close(writer); File.Move(path,path.Replace(PERSIST_EXP,"")); print("下载完成!"); return; } request=httpClient.getWebRequest(url,(int)lStartPos); //设置Range值 writer.Seek(lStartPos,SeekOrigin.Begin);//指针跳转 response=request.GetResponse(); totalLength=response.ContentLength+lStartPos;//总长度 currentLength=lStartPos;//当前长度 } else { response=request.GetResponse(); totalLength=response.ContentLength; } Streamreader=response.GetResponseStream(); byte[]buff=newbyte[1024]; intc=0;//实际读取的字节数 while((c=reader.Read(buff,0,buff.Length))>0) { currentLength+=c; writer.Write(buff,0,c); progressBar(currentLength,totalLength);//进度条 writer.Flush(); } close(writer); if(currentLength==totalLength) { File.Move(path,path.Replace(PERSIST_EXP,"")); print("下载完成!"); } if(reader!=null) { reader.Close(); reader.Dispose(); response.Close(); } } privatestaticvoidclose(FileStreamwriter) { if(writer!=null) { writer.Close(); writer.Dispose(); } } ///<summary> ///进度条 ///</summary> ///<paramname="currentLength">当前长度</param> ///<paramname="totalLength">总长度</param> publicstaticvoidprogressBar(ObjectcurrentLength,ObjecttotalLength) { doubleaaa=System.Convert.ToDouble(currentLength); doublebbb=System.Convert.ToDouble(totalLength); print(currentLength+"/"+totalLength+"__"+(aaa/bbb).ToString("0.00%")); } ///<summary> ///系统输出 ///</summary> ///<paramname="obj"></param> publicstaticvoidprint(Objectobj){ Console.WriteLine(obj); } publicstaticvoidprintStr(string[]str) { foreach(stringdinstr) { print(d); } } ///<summary> ///文件写 ///</summary> ///<paramname="path">文件路径</param> ///<paramname="content">要写入的内容</param> publicstaticvoidfileWriter(stringpath,stringcontent,Encodingencoding) { if(File.Exists(path)) { StreamWritersw=newStreamWriter(path,true,encoding); sw.WriteLine(content); sw.Flush(); sw.Close(); } } ///<summary> ///读文件,返回内容 ///</summary> ///<paramname="path">文件路径</param> ///<paramname="enCoding">默认编码格式</param> ///<returns></returns> publicstaticstringfileReader(stringpath,EncodingenCoding){ StringBuildersb=newStringBuilder(); if(enCoding==null){ enCoding=Encoding.Default; } //读取文件 StreamReadersr=newStreamReader(path,enCoding); strings=""; while((s=sr.ReadLine())!=null) { sb.AppendLine(s); } if(sr!=null) sr.Close(); returnsb.ToString(); } ///<summary> ///获取文件编码格式 ///</summary> ///<paramname="path">文件路径</param> ///<paramname="defaultEncoding">默认编码</param> ///<returns></returns> publicstaticstringgetFileEncoding(stringpath,stringdefaultEncoding){ stringed=defaultEncoding; if(File.Exists(path)){ FileStreamfs=newFileStream(path,FileMode.Open); ed=GetEncoding(fs,defaultEncoding); if(fs!=null) fs.Close(); } returned; } ///<summary> ///取得一个文本文件流的编码方式。 ///</summary> ///<paramname="stream">文本文件流。</param> ///<paramname="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param> ///<returns></returns> publicstaticstringGetEncoding(FileStreamstream,stringdefaultEncoding) { stringtargetEncoding=defaultEncoding; if(stream!=null&&stream.Length>=2) { //保存文件流的前4个字节 bytebyte1=0; bytebyte2=0; bytebyte3=0; bytebyte4=0; //保存当前Seek位置 longorigPos=stream.Seek(0,SeekOrigin.Begin); stream.Seek(0,SeekOrigin.Begin); intnByte=stream.ReadByte(); byte1=Convert.ToByte(nByte); byte2=Convert.ToByte(stream.ReadByte()); if(stream.Length>=3) { byte3=Convert.ToByte(stream.ReadByte()); } if(stream.Length>=4) { byte4=Convert.ToByte(stream.ReadByte()); } //根据文件流的前4个字节判断Encoding //Unicode{0xFF,0xFE}; //BE-Unicode{0xFE,0xFF}; //UTF8={0xEF,0xBB,0xBF}; if(byte1==0xFE&&byte2==0xFF)//UnicodeBe { targetEncoding=Encoding.BigEndianUnicode.BodyName; } if(byte1==0xFF&&byte2==0xFE&&byte3!=0xFF)//Unicode { targetEncoding=Encoding.Unicode.BodyName; } if(byte1==0xEF&&byte2==0xBB&&byte3==0xBF)//UTF8 { targetEncoding=Encoding.UTF8.BodyName; } //恢复Seek位置 stream.Seek(origPos,SeekOrigin.Begin); } returntargetEncoding; } } } usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Security; usingSystem.Security.Cryptography.X509Certificates; usingSystem.IO; namespacesimpleDemo { ///<summary> ///公用Http请求类 ///</summary> classhttpClient { ///<summary> ///获取基础WebRequest ///</summary> ///<paramname="url">请求地址</param> ///<paramname="lStartPos">请求的开始位置</param> ///<returns></returns> publicstaticHttpWebRequestgetWebRequest(stringurl,intlStartPos) { HttpWebRequestrequest=null; try { request=(System.Net.HttpWebRequest)HttpWebRequest.Create(url); request.AddRange(lStartPos);//设置Range值 } catch(Exceptionex) { Program.print(ex.Message); } returnrequest; } } }
希望本文所述对大家的C#程序设计有所帮助。