|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- using Common.Model;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
-
- namespace Common.system
- {
- /// <summary>
- /// 下载方法
- /// 创建人:赵耀
- /// 创建时间:2018年10月30日
- /// </summary>
- public class DownloadService
- {
- private string downloadUrl = "";//文件下载地址
- private string filePath = "";//文件保存路径
- private string method = "";//方法
- private long fromIndex = 0;//开始下载的位置
- private long toIndex = 0;//结束下载的位置
- private long count = 0;//总大小
- private long size = 524288;//每次下载大小 512kb
- private bool isRun = false;//是否正在进行
-
-
- public bool isFinish = false;//是否已下载完成{ get; private set; }
-
- public bool isStopped = true;//是否已停止{ get; private set; }
-
- /// <summary>
- /// 开始下载
- /// </summary>
- public event Action OnStart;
- /// <summary>
- /// 下载进度
- /// </summary>
- public event Action OnDownload;
- /// <summary>
- /// 完成下载
- /// </summary>
- public event Action OnFinsh;
- /// <summary>
- /// 断开网络连接
- /// </summary>
- public event Action OnDisconnect;
-
-
- public long GetDownloadedCount()
- {
- return this.count - this.toIndex + this.fromIndex - 1;
- }
-
- public void Stop()
- {
- this.isRun = false;
- }
-
- /// <summary>
- /// 开始下载
- /// </summary>
- /// <param name="info"></param>
- /// <param name="isReStart"></param>
- /// <returns></returns>
- public bool Start(TaskInfoModel info, bool isReStart)
- {
- this.downloadUrl = info.downloadUrl;
- this.fromIndex = info.fromIndex;
- this.toIndex = info.toIndex;
- this.method = info.method;
- this.filePath = info.filePath;
- this.count = info.count;
- this.isStopped = false;
- if (File.Exists(this.filePath))
- {
- if (isReStart)
- {
- File.Delete(this.filePath);
- File.Create(this.filePath).Close();
- }
- }
- else
- {
- File.Create(this.filePath).Close();
- }
- using (var file = File.Open(this.filePath, FileMode.Open))
- {
- this.fromIndex = info.fromIndex + file.Length;
- }
- if (this.fromIndex >= this.toIndex)
- {
- OnFineshHandler();
- this.isFinish = true;
- this.isStopped = true;
- return false;
- }
- OnStartHandler();
- this.isRun = true;
- new Action(() =>
- {
- WebResponse rsp;
- while (this.fromIndex < this.toIndex && isRun)
- {
- long to;
- if (this.fromIndex + this.size >= this.toIndex - 1)
- to = this.toIndex - 1;
- else
- to = this.fromIndex + size;
- try
- {
- using (rsp = HttpHelper.Download(this.downloadUrl, this.fromIndex, to, this.method))
- {
- Save(this.filePath, rsp.GetResponseStream());
- }
- }
- catch (Exception ex)
- {
- string ErrMessage = "【下载】(DownloadService):" + ex.Message;
- LogHelper.WriteErrLog(ErrMessage, ex);
- OnDisconnectHandler();
- return;
- }
- }
- if (!this.isRun) this.isStopped = true;
- if (this.fromIndex >= this.toIndex)
- {
- this.isFinish = true;
- this.isStopped = true;
- OnFineshHandler();
- }
-
- }).BeginInvoke(null, null);
- return true;
- }
- /// <summary>
- /// 保存文件
- /// </summary>
- /// <param name="filePath"></param>
- /// <param name="stream"></param>
- private void Save(string filePath, Stream stream)
- {
- try
- {
- using (var writer = File.Open(filePath, FileMode.Append))
- {
- using (stream)
- {
- var repeatTimes = 0;
- byte[] buffer = new byte[1024];
- var length = 0;
- while ((length = stream.Read(buffer, 0, buffer.Length)) > 0 && this.isRun)
- {
- writer.Write(buffer, 0, length);
- this.fromIndex += length;
- if (repeatTimes % 5 == 0)
- {
- OnDownloadHandler();
- }
- repeatTimes++;
- }
- }
- }
- OnDownloadHandler();
- }
- catch (Exception)
- {
- //异常也不影响
- }
- }
- /// <summary>
- /// 开始下载
- /// </summary>
- private void OnStartHandler()
- {
- new Action(() =>
- {
- if (this.OnStart != null)
- this.OnStart.Invoke();
- }).BeginInvoke(null, null);
- }
- /// <summary>
- /// 完成下载
- /// </summary>
- private void OnFineshHandler()
- {
- new Action(() =>
- {
- if (this.OnFinsh != null)
- this.OnFinsh.Invoke();
- if (this.OnDownload != null)
- this.OnDownload.Invoke();
- }).BeginInvoke(null, null);
- }
- /// <summary>
- /// 下载进度
- /// </summary>
- private void OnDownloadHandler()
- {
- new Action(() =>
- {
- if (this.OnDownload != null)
- this.OnDownload.Invoke();
- }).BeginInvoke(null, null);
- }
- /// <summary>
- /// 断开网络连接
- /// </summary>
- private void OnDisconnectHandler()
- {
- new Action(() =>
- {
- if (this.OnDisconnect != null)
- this.OnDisconnect.Invoke();
- }).BeginInvoke(null, null);
-
- }
- }
- }
|