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; //开始下载的位置 private long _toIndex; //结束下载的位置 private long _count; //总大小 private readonly long _size = 524288; //每次下载大小 512kb private bool _isRun; //是否正在进行 public bool isFinish; //是否已下载完成{ 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 _count - _toIndex + _fromIndex - 1; } public void Stop() { _isRun = false; } /// /// 开始下载 /// /// /// /// public bool Start(TaskInfoModel info, bool isReStart) { _downloadUrl = info.downloadUrl; _fromIndex = info.fromIndex; _toIndex = info.toIndex; _method = info.method; _filePath = info.filePath; _count = info.count; isStopped = false; if (File.Exists(_filePath)) { if (isReStart) { File.Delete(_filePath); File.Create(_filePath).Close(); } } else { File.Create(_filePath).Close(); } using (FileStream file = File.Open(_filePath, FileMode.Open)) { _fromIndex = info.fromIndex + file.Length; } if (_fromIndex >= _toIndex) { OnFineshHandler(); isFinish = true; isStopped = true; return false; } OnStartHandler(); _isRun = true; new Action(() => { while (_fromIndex < _toIndex && _isRun) { long to; if (_fromIndex + _size >= _toIndex - 1) { to = _toIndex - 1; } else { to = _fromIndex + _size; } try { WebResponse rsp; using (rsp = ZHttpUtil.Download( _downloadUrl, _fromIndex, to, _method )) { Save(_filePath, rsp.GetResponseStream()); } } catch (Exception ex) { string errMessage = "【下载】(DownloadService):" + ex.Message; LogHelper.Logerror.Error(errMessage, ex); OnDisconnectHandler(); return; } } if (!_isRun) { isStopped = true; } if (_fromIndex >= _toIndex) { isFinish = true; isStopped = true; OnFineshHandler(); } }).BeginInvoke(null, null); return true; } /// /// 保存文件 /// /// /// private void Save(string filePath, Stream stream) { try { using (FileStream writer = File.Open(filePath, FileMode.Append)) { using (stream) { int repeatTimes = 0; byte[] buffer = new byte[1024]; int length; while ((length = stream.Read(buffer, 0, buffer.Length)) > 0 && _isRun) { writer.Write(buffer, 0, length); _fromIndex += length; if (repeatTimes % 5 == 0) { OnDownloadHandler(); } repeatTimes++; } } } OnDownloadHandler(); } catch (Exception) { //异常也不影响 } } /// /// 开始下载 /// private void OnStartHandler() { new Action(() => { if (OnStart != null) { OnStart.Invoke(); } }).BeginInvoke(null, null); } /// /// 完成下载 /// private void OnFineshHandler() { new Action(() => { if (OnFinsh != null) { OnFinsh.Invoke(); } if (OnDownload != null) { OnDownload.Invoke(); } }).BeginInvoke(null, null); } /// /// 下载进度 /// private void OnDownloadHandler() { new Action(() => { if (OnDownload != null) { OnDownload.Invoke(); } }).BeginInvoke(null, null); } /// /// 断开网络连接 /// private void OnDisconnectHandler() { new Action(() => { if (OnDisconnect != null) { OnDisconnect.Invoke(); } }).BeginInvoke(null, null); } } }