C# http下載(支持斷點續傳)


分享下項目里面自己封裝的一個http下載類

功能如下:

1、支持斷點續傳

2、下載失敗自動重試

3、超時等異常處理

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
public class HttpManager
{
    const int bytebuff = 1024;
    const int ReadWriteTimeOut = 2 * 1000;//超時等待時間
    const int TimeOutWait = 5 * 1000;//超時等待時間
    const int MaxTryTime = 12;
    static Dictionary<string,int> TryNumDic = new Dictionary<string,int>();
  
    /// <summary>
    /// 下載文件(同步)  支持斷點續傳
    /// </summary>
    /// <param name="url">文件url</param>
    /// <param name="savepath">本地保存路徑</param>
    /// <param name="progress">下載進度(百分比)</param>
    /// <param name="size">下載文件大小</param>
public static void DowLoadFile(string url,string savepath,ref int progress,long size = 0) { //打開上次下載的文件 long lStartPos = 0; FileStream fs; if(File.Exists(savepath)) { fs = File.OpenWrite(savepath); lStartPos = fs.Length; fs.Seek(lStartPos,SeekOrigin.Current);//移動文件流中的當前指針 } else { string direName = Path.GetDirectoryName(savepath); if(!Directory.Exists(direName))//如果不存在保存文件夾路徑,新建文件夾 { Directory.CreateDirectory(direName); } fs = new FileStream(savepath, FileMode.Create); lStartPos = 0; } HttpWebRequest request = null; try{ if(size == 0) { size = GetFileContentLength(url); } if(size != 0 && size == lStartPos) { //下載完成 fs.Close(); return; } request = (HttpWebRequest)WebRequest.Create(url); request.ReadWriteTimeout = ReadWriteTimeOut; request.Timeout = TimeOutWait; if(lStartPos>0) request.AddRange((int)lStartPos);//設置Range值,斷點續傳 //向服務器請求,獲得服務器回應數據流 WebResponse respone = request.GetResponse(); long totalSize = respone.ContentLength + lStartPos; long curSize = lStartPos; progress = (int)(curSize / totalSize *100); Stream ns = respone.GetResponseStream(); byte[] nbytes = new byte[bytebuff]; int nReadSize = 0; while(nReadSize > 0) { fs.Write(nbytes, 0, nReadSize); nReadSize = ns.Read(nbytes, 0 ,bytebuff); curSize += nReadSize; //下載進度計算 if (progress < (int)((double)curSize / totalSize * 100)) progress = (int)((double)curSize / totalSize * 100); fs.Flush(); ns.Close(); fs.Close(); if(curSize!=totalSize)//文件長度不等於下載長度,下載出錯 { throw new Exception(); } if(request != null) { request.Abort(); } TryNumDic.Remove(url); } } catch { if(request!=null) { request.Abort(); } fs.Close(); if(TryNumDic.ContainsKey(url)) { if(TryNumDic[url]>MaxTryTime) { TryNumDic.Remove(url); throw new Exception(); } else { TryNumDic[url]++; } } else { TryNumDic.Add(url,1); } DowLoadFile(url, savepath, ref progress, size); } } /// <summary> /// 獲取下載文件長度 /// </summary> /// <param name="url"></param> /// <returns></returns> public static long GetFileContentLength(string url) { HttpWebRequest request = null; try { request = (HttpWebRequest)HttpWebRequest.Create(url); request.Timeout = TimeOutWait; request.ReadWriteTimeout = ReadWriteTimeOut; //向服務器請求,獲得服務器回應數據流 WebResponse respone = request.GetResponse(); request.Abort(); return respone.ContentLength; } catch(Exception e) { if(request != null) request.Abort(); return 0; } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM