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);
}
}
}