using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HttpDownload { public class DownloadTask { public int BelongingId { get; set; } public int DownloadTaskId { get; set; } public string FileUrl { get; } public string FileDir { get; } public long Offset { get; } // 开始下载的位置 public string ExpectedMD5 { get; } private volatile DownloadStatus status; public DownloadStatus Status { get { return status; } } private string exceptionInfo; public string ExceptionInfo { get { return exceptionInfo; } } // 保存发生异常时的Message private double percentage = 0d; private HttpDownloader httpDownloader = null; /// /// /// /// /// /// /// 如果 offset == -1, 则把已写入文件的字节数当作offset public DownloadTask(string fileUrl, string fileDir, string expectedMD5, long offset = 0L) { this.FileUrl = fileUrl; this.FileDir = fileDir; this.Offset = offset; this.ExpectedMD5 = expectedMD5; status = DownloadStatus.Created; exceptionInfo = string.Empty; httpDownloader = new HttpDownloader(fileUrl, fileDir, offset); } public DownloadTask(int belongingId, int downTaskId, string fileUrl, string fileDir, string expectedMD5, long offset = 0L) { this.BelongingId = belongingId; this.DownloadTaskId = downTaskId; this.FileUrl = fileUrl; this.FileDir = fileDir; this.Offset = offset; this.ExpectedMD5 = expectedMD5; status = DownloadStatus.Created; exceptionInfo = string.Empty; httpDownloader = new HttpDownloader(fileUrl, fileDir, offset); } internal static void download(DownloadTask dTask) { try { if (dTask.status.Equals(DownloadStatus.Paused)) return; dTask.status = DownloadStatus.Processing; dTask.httpDownloader.DownloadFile(); if (dTask.httpDownloader.running) dTask.status = DownloadStatus.Completed; } catch (Exception ex) { dTask.status = DownloadStatus.ExceptionStopped; dTask.exceptionInfo = ex.Message; } } public string calculateMD5() { if (Status.Equals(DownloadStatus.Completed)) { string md5Digest = ""; return md5Digest; } return null; } public void pauseTask() { if (status == DownloadStatus.Completed) return; httpDownloader.running = false; status = DownloadStatus.Paused; } public void resumeTask() { if (!httpDownloader.running) { httpDownloader.running = true; status = DownloadStatus.WaitToRun; } } public bool isFinished() { return httpDownloader.Finished; } public string getFileName() { return Path.GetFileName(FileDir); } public long totalFileSize { get { if (httpDownloader != null) return httpDownloader.TotalRemoteFileSize; return 0; } } public long BytesWritten { get { if (httpDownloader != null) return httpDownloader.BytesWritten; return 0; } } public string getSpeed(bool isFormatted) { if (httpDownloader != null && DownloadStatus.Processing.Equals(status)) return httpDownloader.getSpeed(isFormatted); return "0 B/s"; } public double getPercentage(int decimals) { if (httpDownloader != null) return httpDownloader.getPercentage(decimals); return 0d; } } public enum DownloadStatus { Created, // 初始状态 WaitToRun, // 进入队列等待被执行 Paused, // 已暂停 Processing,// 正在执行 Completed, // 完成 ExceptionStopped // 出现异常已暂停 } }