using Common.Model; using System; using System.IO; using System.Net; namespace Common.system { /// /// 下载方法 /// 创建人:赵耀 /// 创建时间:2018年10月30日 /// 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; } /// /// 开始下载 /// public event Action OnStart; /// /// 下载进度 /// public event Action OnDownload; /// /// 完成下载 /// public event Action OnFinsh; /// /// 断开网络连接 /// public event Action OnDisconnect; public long GetDownloadedCount() { return this.count - this.toIndex + this.fromIndex - 1; } public void Stop() { this.isRun = false; } /// /// 开始下载 /// /// /// /// 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; } /// /// 保存文件 /// /// /// 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) { //异常也不影响 } } /// /// 开始下载 /// private void OnStartHandler() { new Action(() => { if (this.OnStart != null) this.OnStart.Invoke(); }).BeginInvoke(null, null); } /// /// 完成下载 /// private void OnFineshHandler() { new Action(() => { if (this.OnFinsh != null) this.OnFinsh.Invoke(); if (this.OnDownload != null) this.OnDownload.Invoke(); }).BeginInvoke(null, null); } /// /// 下载进度 /// private void OnDownloadHandler() { new Action(() => { if (this.OnDownload != null) this.OnDownload.Invoke(); }).BeginInvoke(null, null); } /// /// 断开网络连接 /// private void OnDisconnectHandler() { new Action(() => { if (this.OnDisconnect != null) this.OnDisconnect.Invoke(); }).BeginInvoke(null, null); } } }