diff --git a/winform1/Form1.cs b/winform1/Form1.cs index 407f7a47f340d221cc7792a6a632b94c6c1fbc7d..d18af802ed4bc1ef5d26af75c2e4064766a868d1 100644 --- a/winform1/Form1.cs +++ b/winform1/Form1.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Data; using System.Drawing; using System.Linq; @@ -9,6 +9,7 @@ using System.IO; using System.Net; using System.Threading.Tasks; using Ionic.Zip; +using System.Runtime.InteropServices; namespace winform1 { @@ -17,12 +18,15 @@ namespace winform1 private Point m_mousePos; private bool m_isMouseDown; //要下载的文件的url - private const string m_url = "https://codechina.csdn.net/linxinfa/winform-download-demo/-/raw/master/winform1/res/guitar.zip"; - //下载到本地的文件名 - private const string m_saveFile = "./download.zip"; - //加压目录 - private const string m_unzipFile = "./unzip"; + private const string m_url = "https://smallgame.download.lkgame.com/game_space/sfish/57/qgame_test/QQGameUnityDemo.zip"; + private const long m_totalSize = 21388019; + private const string m_md5 = "44BB65977FBF90062E8A3F5521D84A11"; + //下载到本地的文件名 + private const string m_saveFile = "./qgame_unity_demo.zip"; + //解压目录 + private const string m_unzipFile = "./qgame_unity_demo"; + private const string m_exePath = "./qgame_unity_demo/QQGameUnityDemo/QQGameDemo.exe"; public Form1() { @@ -30,7 +34,10 @@ namespace winform1 InitUi(); - StartDownload(); + if (!TryOpenUnityDemoExe()) + { + StartDownload(); + } } private void InitUi() @@ -47,6 +54,7 @@ namespace winform1 progressBar.MouseDown += OnMouseDown; progressBar.MouseUp += OnMouseUp; progressBar.MouseMove += OnMouseMove; + //提示语 tipsLbl.Parent = pictureBg; processLbl.Parent = pictureBg; @@ -54,7 +62,23 @@ namespace winform1 //进度条 progressBar.Minimum = 0; - progressBar.Maximum = 100; + } + + private bool TryOpenUnityDemoExe() + { + + if (File.Exists(m_saveFile) && DownloadThread.GetMD5FromFile(m_saveFile) != m_md5) + { + return false; + } + + if (File.Exists(m_exePath)) + { + WinExec(m_exePath, 1); + System.Environment.Exit(0); + return true; + } + return false; } #region 隐藏标题栏后支持移动窗口 @@ -98,19 +122,25 @@ namespace winform1 /// 被委托调用,专门设置进度条最大值 /// /// - public void SetMax(int maxValue) + public void UpdateProgressMaxValue(int maxValue) { progressBar.Maximum = maxValue; + UpdateTipsLbl("正在下载,请耐心等待"); + } + + public void UpdateTipsLbl(string txt) + { + tipsLbl.Text = txt; } /// /// 被委托调用,专门设置进度条当前值 /// /// - private void SetNow(int nowValue) + private void UpdateProgressCurValue(int curValue) { - progressBar.Value = nowValue; - string nowValueStr = string.Format("{0:F}", (float)nowValue / this.progressBar.Maximum * 100); + progressBar.Value = curValue; + string nowValueStr = string.Format("{0:F}", (float)curValue / progressBar.Maximum * 100); processLbl.Text = nowValueStr + "%"; } #endregion @@ -119,12 +149,13 @@ namespace winform1 { DownloadThread method = new DownloadThread(); //先订阅一下事件 - method.threadStartEvent += new EventHandler(DownloadThreadStartEvent); - method.threadEvent += new EventHandler(DownloadThreadIngEvent); - method.threadEndEvent += new EventHandler(DownloadThreadEndEvent); + method.eventDownloadStart += OnEventDownloadStart; + method.eventDownloadIng += OnEventDownloadIng; + method.eventCheckingMd5 += OnEventCheckMd5; + method.eventDownloadDone += OnEventDownloadDone; //开启一个线程进行下载 - Task task = new Task(() => { method.RunMethod(m_url, m_saveFile); }); + Task task = new Task(() => { method.RunMethod(m_url, m_saveFile, m_totalSize, m_md5); }); task.Start(); } @@ -136,37 +167,38 @@ namespace winform1 } } - /// + /// 线程开始事件,设置进度条最大值 - /// 但是我不能直接操作进度条,需要一个委托来替我完成 - /// - /// ThreadMethod函数中传过来的最大值 - /// - void DownloadThreadStartEvent(object sender, EventArgs e) + /// 但是不能直接操作进度条,需要一个委托来替我完成 + void OnEventDownloadStart(long totalSize) { - int maxValue = Convert.ToInt32(sender); - Invoke(new Action(SetMax), maxValue); + Invoke(new Action(UpdateProgressMaxValue), (int)totalSize); } - /// /// 线程执行中的事件,设置进度条当前进度 - /// 但是我不能直接操作进度条,需要一个委托来替我完成 - /// - /// ThreadMethod函数中传过来的当前值 - /// - void DownloadThreadIngEvent(object sender, EventArgs e) + /// 但是不能直接操作进度条,需要一个委托来替我完成 + void OnEventDownloadIng(long curDownloadSize) { - int nowValue = Convert.ToInt32(sender); - Invoke(new Action(SetNow), nowValue); + Invoke(new Action(UpdateProgressCurValue), (int)curDownloadSize); + } + + void OnEventCheckMd5() + { + Invoke(new Action(UpdateTipsLbl), "正在校验文件,请稍等"); } /// /// 线程完成事件 /// - void DownloadThreadEndEvent(object sender, EventArgs e) + void OnEventDownloadDone() { - MessageBox.Show("下载完成完成,点击确定执行解压"); + //解压文件 UnZipFile(m_saveFile); + //尝试打开下载的exe + TryOpenUnityDemoExe(); } + + [DllImport("kernel32.dll")] + public static extern int WinExec(string exeName, int operType); } }