C#实现http多线程断点续传下载文件

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Net;
using u8 = System.Byte;
using u16 = System.UInt16;
using s32 = System.Int32;
using u32 = System.UInt32;
using f32 = System.Single;


namespace ConsoleApplication1
{
    public class HttpDownloadFile
    {
        public void SetURL(string URL)
        {
            mURL = URL;
        }

        //单线程下载文件大小阀值
        public void SetSingleThFileSize(u32 FileSize)
        {
            mSingleThFileSize = FileSize;
        }

        //下载速度KB/S,需要外部循环调用Run函数更新这个值
        public f32 GetDownloadSpeed()
        {
            return mDownloadSpeed / 1024;
        }

        //添加异步下载文件,这里提供输入文件大小的原因是
        //方便灵活扩展,比如游戏更新,我们有可能先同步下载一个version.txt的
        //文件里面包含类似md5和文件大小与本地比较找到需要下载的文件
        //这时我们已经可以从version.txt里面提前知道需要下载文件的大小了
        public void AddAsyncDownloadFile(string RemoteFilePath, string LocalFilePath, u32 RemoteFileSize = 0)
        {
            mDownloadFiles.Add(new DownloadFile(RemoteFilePath, LocalFilePath, RemoteFileSize));
        }

        //同步下载文件
        public bool SyncDownloadFile(string RemoteFilePath, string LocalFilePath)
        {
            try
            {
                var HttpRequest = WebRequest.Create(mURL + "//" + RemoteFilePath) as HttpWebRequest;
                var HttpResponse = HttpRequest.GetResponse() as HttpWebResponse;
                var HttpStream = HttpResponse.GetResponseStream();
                _PrepareDirForFile(LocalFilePath);
                var OutStream = new FileStream(LocalFilePath, FileMode.Create);
                var Buffer = new Byte[1024];
                var ReadBytes = 0;
                while (true)
                {
                    ReadBytes = HttpStream.Read(Buffer, 0, Buffer.Length);
                    if (ReadBytes <= 0)
                    {
                        break;
                    }
                    OutStream.Write(Buffer, 0, ReadBytes);
                }
                OutStream.Close();
                HttpStream.Close();
                HttpResponse.Close();
                HttpRequest.Abort();
                return true;
            }
            catch (WebException e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }

        public void StartAsyncDownloadFiles()
        {
            _CutFile();
            Thread t;
            for (s32 i = 0; i < Environment.ProcessorCount; ++i)
            {
                t = new Thread(new ParameterizedThreadStart(_AsyncDownloadFiles));
                t.Start(i);
            }

            //文件下载进度、总下载进度、下载完成事件请自行添加了...
        }

        void Run(f32 TimeDelta)
        {
            if (mDownloadBytes >= mTotalDownloadBytes)
            {
                return;
            }
            mTimeDelta += TimeDelta;
            if (mTimeDelta >= 1.0f)
            {
                mDownloadSpeed = mDownloadBytesCounter;
                mTimeDelta = .0f;
   
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值