diff --git a/winform1/DownloadThread.cs b/winform1/DownloadThread.cs
index d170a1072aa743b6756b81ad644b0a98771e3ebf..a0cca86587359c6ed98e36879c18381f96aeb0ee 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)
{