| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
cymt
10年前发布

C#实现文件下载,支持断点续传

using System;  using System.Data;  using System.Configuration;  using System.Web;  using System.Web.Security;  using System.IO;  using System.Text;  using System.Net;  namespace simpleDemo  {            class Program      {          /// <summary>          /// 下载文件保留字          /// </summary>          public static string PERSIST_EXP = ".cdel";          /// <summary>            public static void Main(string[] args)          {                string path = "D:\\aa.txt";                string ec = getFileEncoding(path, "GB2312");              print("coding: " + ec);                // string content = fileReader(path, Encoding.GetEncoding(ec));              // print(content);                //fileWriter(path, "测试内容11", Encoding.GetEncoding(ec));                string url = "http://www.XXX.com/20120920172200024.flv";              string path1 = "D:\\aa1.flv";                  download(url, path1);              //gapDownload(url, path1);              //t(url);                       }          public static void t(string url) {                            HttpWebRequest request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);                  //WebResponse response = httpClient.CreateGetHttpResponse(url, 3000, null, null);                try {                                    WebResponse response = request.GetResponse();                    WebHeaderCollection headers = response.Headers;                    print(response.ContentLength);                    request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);                  request.AddRange(11); //设置Range值                  WebResponse response1 = request.GetResponse();                  print(response1.ContentLength);                      foreach (string key in headers)                  {                      print(key + "----- " + headers.Get(key));                  }                    string disposition = headers.Get("Content-Disposition");                    print(disposition);              }catch(Exception e){                  print(e.Message);              }                //string fileName = disposition.Substring(disposition.IndexOf("\""));                //print(fileName);                      }          public static void download(string url, string path) {              if (File.Exists(path))              {                  print("文件己存在!是否重新下载?");                  return;              }              else {                  path = path + PERSIST_EXP;                    simpleDownload(url,path);//开始下载              }             }          /// <summary>          /// 下载网络资源(支持断点续传)          /// </summary>          /// <param name="url"></param>          /// <param name="path"></param>          public static void simpleDownload(string url, string path)          {              HttpWebRequest request = httpClient.getWebRequest(url, 0);                            WebResponse response = null;                FileStream writer = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);              long lStartPos = writer.Length; ;//当前文件大小              long currentLength = 0;              long totalLength = 0;//总大小                             if (File.Exists(path))//断点续传              {                  response = request.GetResponse();                  long sTotal = 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;              }                Stream reader = response.GetResponseStream();                byte[] buff = new byte[1024];              int c = 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();              }          }          private static void close(FileStream writer)          {              if (writer != null)              {                  writer.Close();                  writer.Dispose();              }          }          /// <summary>          /// 进度条          /// </summary>          /// <param name="currentLength">当前长度</param>          /// <param name="totalLength">总长度</param>          public static void progressBar(Object currentLength, Object totalLength)          {              double aaa = System.Convert.ToDouble(currentLength);              double bbb = System.Convert.ToDouble(totalLength);              print(currentLength + "/" + totalLength + "__" + (aaa / bbb).ToString("0.00 %"));          }          /// <summary>          /// 系统输出          /// </summary>          /// <param name="obj"></param>          public static void print(Object obj){              Console.WriteLine(obj);          }          public static void printStr(string[] str)          {              foreach (string d in str)              {                  print(d);              }          }          /// <summary>          /// 文件写          /// </summary>          /// <param name="path">文件路径</param>          /// <param name="content">要写入的内容</param>          public static void fileWriter(string path,string content,Encoding encoding)          {              if (File.Exists(path))              {                  StreamWriter sw = new StreamWriter(path, true, encoding);                                    sw.WriteLine(content);                    sw.Flush();                  sw.Close();              }          }          /// <summary>          /// 读文件,返回内容          /// </summary>          /// <param name="path">文件路径</param>          /// <param name="enCoding">默认编码格式</param>          /// <returns></returns>          public static string fileReader(string path,Encoding enCoding) {              StringBuilder sb = new StringBuilder();              if(enCoding == null){                  enCoding = Encoding.Default;              }              //读取文件              StreamReader sr = new StreamReader(path, enCoding);                  string s = "";                  while ((s = sr.ReadLine()) != null)                  {                      sb.AppendLine(s);                  }                  if(sr != null)                      sr.Close();                return sb.ToString();          }          /// <summary>          /// 获取文件编码格式          /// </summary>          /// <param name="path">文件路径</param>          /// <param name="defaultEncoding">默认编码</param>          /// <returns></returns>          public static string getFileEncoding(string path, string defaultEncoding) {              string ed = defaultEncoding;              if (File.Exists(path)) {                  FileStream fs = new FileStream(path, FileMode.Open);                  ed = GetEncoding(fs, defaultEncoding);                  if (fs != null)                      fs.Close();                 }              return ed;          }          /// <summary>          /// 取得一个文本文件流的编码方式。          /// </summary>          /// <param name="stream">文本文件流。</param>          /// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>          /// <returns></returns>          public static string GetEncoding(FileStream stream, string defaultEncoding)          {              string targetEncoding = defaultEncoding;              if (stream != null && stream.Length >= 2)              {                  //保存文件流的前4个字节                  byte byte1 = 0;                  byte byte2 = 0;                  byte byte3 = 0;                  byte byte4 = 0;                  //保存当前Seek位置                  long origPos = stream.Seek(0, SeekOrigin.Begin);                  stream.Seek(0, SeekOrigin.Begin);                    int nByte = 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);              }              return targetEncoding;          }        }  }            using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Net;  using System.Net.Security;  using System.Security.Cryptography.X509Certificates;  using System.IO;    namespace simpleDemo  {      /// <summary>      /// 公用 Http 请求类      /// </summary>      class httpClient      {          /// <summary>          /// 获取基础WebRequest          /// </summary>          /// <param name="url">请求地址</param>          /// <param name="lStartPos">请求的开始位置</param>          /// <returns></returns>          public static HttpWebRequest getWebRequest(string url, int lStartPos)          {              HttpWebRequest request = null;              try              {                  request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);                  request.AddRange(lStartPos); //设置Range值              }              catch (Exception ex)              {                  Program.print(ex.Message);              }                return request;          }      }  }