提交 7ee908d1 编写于 作者: 林新发's avatar 林新发

Update DownloadThread.cs

上级 46248440
using System; using System;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Security.Cryptography;
using System.Text;
namespace winform1 namespace winform1
{ {
class DownloadThread class DownloadThread
{ {
/// <summary> public delegate void EventDownloadStart(long totalSize);
/// 线程开始事件 public delegate void EventDownloadIng(long curDownloadSize);
/// </summary> public delegate void EventCheckingMd5();
public event EventHandler threadStartEvent; public delegate void EventDownloadDone();
/// <summary>
/// 线程执行时事件 public event EventDownloadStart eventDownloadStart;
/// </summary> public event EventDownloadIng eventDownloadIng;
public event EventHandler threadEvent; public event EventCheckingMd5 eventCheckingMd5;
/// <summary> public event EventDownloadDone eventDownloadDone;
/// 线程结束事件
/// </summary> public static string GetMD5FromFile(string filename)
public event EventHandler threadEndEvent; {
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;
}
}
/// <summary> /// <summary>
/// c#,.net 下载文件 /// c#,.net 下载文件
/// </summary> /// </summary>
/// <param name="url">下载文件地址</param> /// <param name="url">下载文件地址</param>
/// <param name="filename">下载后的存放地址</param> /// <param name="filename">下载后的存放地址</param>
public void RunMethod(string url, string filename) public void RunMethod(string url, string filename, long totalSize, string md5)
{ {
try try
{ {
Stream st;
Stream so;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); request.Timeout = 10000;
//通知主界面,我开始了, response.ContentLength用来设置进度条的最大值 //通知主界面,我开始了, 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]; byte[] by = new byte[1024];
int osize = st.Read(by, 0, by.Length); int osize = st.Read(by, 0, by.Length);
while (osize > 0) while (osize > 0)
...@@ -46,13 +93,22 @@ namespace winform1 ...@@ -46,13 +93,22 @@ namespace winform1
osize = st.Read(by, 0, by.Length); osize = st.Read(by, 0, by.Length);
//通知主界面我正在执行,totalDownloadedByte表示进度条当前进度 //通知主界面我正在执行,totalDownloadedByte表示进度条当前进度
threadEvent.Invoke(totalDownloadedByte, null); eventDownloadIng(totalDownloadedByte);
} }
so.Close(); so.Close();
st.Close(); st.Close();
//通知主界面我已经完成了 eventCheckingMd5();
threadEndEvent.Invoke(null, null); if (GetMD5FromFile(filename) != md5)
{
//md5校验不通过,重新传
RunMethod(url, filename, totalSize, md5);
}
else
{
//通知主界面我已经完成了
eventDownloadDone();
}
} }
catch (Exception) catch (Exception)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册