From 7ee908d1388df3d618243cdc733f3b0bf9f819d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E6=96=B0=E5=8F=91?= <565192010@qq.com> Date: Tue, 13 Oct 2020 10:17:07 +0800 Subject: [PATCH] Update DownloadThread.cs --- winform1/DownloadThread.cs | 102 ++++++++++++++++++++++++++++--------- 1 file changed, 79 insertions(+), 23 deletions(-) diff --git a/winform1/DownloadThread.cs b/winform1/DownloadThread.cs index d170a10..a0cca86 100644 --- a/winform1/DownloadThread.cs +++ b/winform1/DownloadThread.cs @@ -1,42 +1,89 @@ -using System; +using System; using System.IO; using System.Net; - +using System.Security.Cryptography; +using System.Text; namespace winform1 { class DownloadThread { - /// - /// 线程开始事件 - /// - public event EventHandler threadStartEvent; - /// - /// 线程执行时事件 - /// - public event EventHandler threadEvent; - /// - /// 线程结束事件 - /// - public event EventHandler threadEndEvent; + public delegate void EventDownloadStart(long totalSize); + public delegate void EventDownloadIng(long curDownloadSize); + public delegate void EventCheckingMd5(); + public delegate void EventDownloadDone(); + + public event EventDownloadStart eventDownloadStart; + public event EventDownloadIng eventDownloadIng; + public event EventCheckingMd5 eventCheckingMd5; + public event EventDownloadDone eventDownloadDone; + + public static string GetMD5FromFile(string filename) + { + try + { + FileStream fs = new FileStream(filename, FileMode.Open); + MD5CryptoServiceProvider md5Helper = new MD5CryptoServiceProvider(); + byte[] data = md5Helper.ComputeHash(fs); + fs.Close(); + StringBuilder sbr = new StringBuilder(); + for (int i = 0; i < data.Length; ++i) + { + sbr.Append(data[i].ToString("X2")); + } + string md5Str = sbr.ToString(); + return md5Str; + } + catch (Exception) + { + throw; + } + } /// /// c#,.net 下载文件 /// /// 下载文件地址 /// 下载后的存放地址 - public void RunMethod(string url, string filename) + public void RunMethod(string url, string filename, long totalSize, string md5) { try { + Stream st; + Stream so; + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); - HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + request.Timeout = 10000; + //通知主界面,我开始了, response.ContentLength用来设置进度条的最大值 - threadStartEvent.Invoke(response.ContentLength, null); + eventDownloadStart(totalSize); + + if (File.Exists(filename)) + { + //续传 + so = File.OpenWrite(filename); + if (so.Length < totalSize) + { + so.Seek(so.Length, SeekOrigin.Current); + request.AddRange((int)so.Length); + } + else + { + so.Close(); + so = new FileStream(filename, FileMode.Create); + } + + } + else + { + so = new FileStream(filename, FileMode.Create); + } + + long totalDownloadedByte = so.Length; + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + + st = response.GetResponseStream(); - Stream st = response.GetResponseStream(); - Stream so = new FileStream(filename, FileMode.Create); - long totalDownloadedByte = 0; byte[] by = new byte[1024]; int osize = st.Read(by, 0, by.Length); while (osize > 0) @@ -46,13 +93,22 @@ namespace winform1 osize = st.Read(by, 0, by.Length); //通知主界面我正在执行,totalDownloadedByte表示进度条当前进度 - threadEvent.Invoke(totalDownloadedByte, null); + eventDownloadIng(totalDownloadedByte); } so.Close(); st.Close(); - //通知主界面我已经完成了 - threadEndEvent.Invoke(null, null); + eventCheckingMd5(); + if (GetMD5FromFile(filename) != md5) + { + //md5校验不通过,重新传 + RunMethod(url, filename, totalSize, md5); + } + else + { + //通知主界面我已经完成了 + eventDownloadDone(); + } } catch (Exception) { -- GitLab