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#程序设计有所帮助。