公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

WinForm 自動更新程序(三)

admin
2023年2月27日 10:17 本文熱度 1190

    這一篇就著重寫一下客戶端的代碼,客戶端主要實現的有:啟動后檢測本地的xml文件,然后發送到服務器獲取需要更新的文件以及版本列表。循環下載。下載成功后,備份原始文件->復制到主目錄(若失敗進行回滾)->修改本地xml文件,更新完成后打開主程序。


開發環境:.NET Core 3.1

開發工具: Visual Studio 2019

實現代碼:

 /// <summary>        /// 更新自己        /// </summary>        private void CopyRun() {
string runPath = Process.GetCurrentProcess().MainModule.FileName; string runName = Path.GetFileName(runPath);
if(!runName.StartsWith("_")) { string copyPath = runPath.Replace(runName, "_" + runName); byte[] bytes; using(FileStream fileStream = new FileStream(runPath, FileMode.Open, FileAccess.Read)) { bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); } using(FileStream fileStream = new FileStream(copyPath, FileMode.create, FileAccess.Write)) { fileStream.Write(bytes); }
ProcessStartInfo info = new ProcessStartInfo(copyPath, _runApp); Process.Start(info); Environment.Exit(0); }
}
/// <summary> /// 更新UI /// </summary> /// <param name="actoin"></param> private void updateUI(Action actoin) { if(this.InvokeRequired) { this.BeginInvoke(actoin); } else { actoin(); } }
/// <summary> /// 獲取本地更新地址 /// </summary> /// <returns></returns> private string GetupdateUrl() { XElement xele = XElement.Load(updateXml); string url = xele.Element("url").Value; return url; }
/// <summary> /// 獲取本地更新文件 /// </summary> /// <returns></returns> private string GetupdateFiles() { XDocument xdoc = XDocument.Load(updateXml); var files = from f in xdoc.Root.Element("files").Elements() select new { name = f.Attribute("name").Value, version = f.Attribute("version").Value }; return JsonConvert.SerializeObject(files); }
/// <summary> /// 更新完成后修改版本文件 /// </summary> /// <param name="list"></param> private void updateXml(List<updateModel> list) { XDocument xdoc = XDocument.Load(updateXml); foreach(var model in list) { var ele_files = xdoc.Root.Element("files");
XElement xele = ele_files.Elements().FirstOrDefault(s => s.Attribute("name").Value == model.name); if(xele != null) { xele.SetAttributeValue("version", model.version); } else { XElement addXele = new XElement("file"); addXele.SetAttributeValue("name", model.name); addXele.SetAttributeValue("version", model.version); ele_files.Add(addXele); } } xdoc.Save(updateXml); }
 readonly string _runApp;        public Form_update(string runApp) {            InitializeComponent();            _runApp = runApp;            //CopyRun();        }        readonly string updateXml = Application.StartupPath + "updateList.xml";        private void btn_update_Click(object sender, EventArgs e) {            #region 設置ui            btn_update.Enabled = false;            label_status.Text = "正在更新";            #endregion
#region 初始化路徑 string savePath = Application.StartupPath + "temp_update\\"; string backPath = Application.StartupPath + "temp_back\\"; if(Directory.Exists(savePath)) { Directory.delete(savePath, true); } Directory.createDirectory(savePath);
if(Directory.Exists(backPath)) { Directory.delete(backPath, true); } Directory.createDirectory(backPath);
#endregion
#region 圖標旋轉 int angle = 0; Image img = pictureBox1.BackgroundImage;
System.Threading.Timer timer = new System.Threading.Timer(s => { updateUI(() => { angle = angle == 360 ? 0 : angle + 10; pictureBox1.BackgroundImage = img.RotateImage(angle); }); }, null, 0, 100); #endregion
#region 下載更新 string url = GetupdateUrl(); bool isSuccess = false; Task.Run(() => { try { //獲取下載列表 HttpResult httpResult = HttpUtil.HttpRequest(new HttpItem(url + "GetupdateFiles", requestData: GetupdateFiles())); if(httpResult.Status) { updateModel_Out output = JsonConvert.DeserializeObject<updateModel_Out>(httpResult.HttpStringData);
if(output.updateList.Count == 0) { throw new Exception("當前已是最新版本"); }
updateUI(() => { progressBar1.Maximum = output.updateList.Count + 1; }); //循環下載文件 for(int i = 0; i < output.updateList.Count; i++) {
updateModel updateModel = output.updateList[i]; #region 進度條 updateUI(() => { label_status.Text = $"正在更新第 {i + 1}/{output.updateList.Count} 個文件,文件名:{updateModel.name}"; progressBar1.Value = i + 1; }); #endregion
#region 下載文件 httpResult = HttpUtil.HttpRequest(new HttpItem(url + "DownloadFile", requestData: JsonConvert.SerializeObject(updateModel))); if(httpResult.Status) { using(FileStream fileStream = new FileStream(savePath + updateModel.name, FileMode.create)) { fileStream.Write(httpResult.HttpByteData, 0, httpResult.HttpByteData.Length); } } else { throw new Exception(updateModel.name + "下載失敗,請重試"); } #endregion
Task.Delay(1000).Wait(); }
#region 備份 updateUI(() => { label_status.Text = "正在備份"; }); try { File.Copy(updateXml, backPath + "updateList.xml"); foreach(var file in output.updateList) { if(File.Exists(Application.StartupPath + file.name)) { File.Copy(Application.StartupPath + file.name, backPath + file.name, true); } } } catch { } #endregion
#region 完成更新 updateUI(() => { label_status.Text = "正在完成更新"; progressBar1.Value = progressBar1.Maximum; }); string[] files = Directory.GetFiles(savePath); try { #region 更新成功 foreach(string file in files) { File.Copy(file, Application.StartupPath + Path.GetFileName(file), true); } Directory.delete(savePath, true); #region 保存最新版本 updateXml(output.updateList); isSuccess = true; updateUI(() => { label_status.Text = "更新完成"; }); #endregion #endregion } catch { #region 失敗回滾 updateUI(() => { label_status.Text = "更新失敗,正在回滾"; }); string[] files_back = Directory.GetFiles(backPath); foreach(string file in files_back) { File.Copy(file, Application.StartupPath + Path.GetFileName(file), true); } File.Copy(backPath + "updateList.xml", updateXml, true); updateUI(() => { label_status.Text = "回滾完成"; }); return; #endregion } #endregion } else { throw new Exception("獲取更新列表失敗"); } } catch(Exception ex) { updateUI(() => { label_status.Text = "更新失敗!" + ex.Message; btn_update.Enabled = true; }); } finally { updateUI(() => { timer.Change(-1, -1); pictureBox1.BackgroundImage = img; if(isSuccess) { if(File.Exists(_runApp)) { if(MessageBox.Show("更新完成,是否打開程序", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { Process.Start(_runApp); } Environment.Exit(0); } } }); } }); #endregion
}
private void btn_close_Click(object sender, EventArgs e) { Close(); }
private void panel1_Paint(object sender, PaintEventArgs e) { Pen pen = new Pen(Color.LightGray); e.Graphics.DrawLine(pen, new Point(36, 36), new Point(panel1.Width - 36, 36)); }

實現效果:


代碼解析:主要注釋已經在代碼中標注了,由于基本都是在線程中進行操作的,所以在更新UI的時候封裝了updateUI方法,然后就是加了一個定時器實現圖標的旋轉。關于CopyRun(更新自己)方法,就是用來更新自動更新程序本身的,即運行之前復制一份本身,然后啟動復制的程序,否則本身正在運行的時候是不能更新自己的。


該文章在 2023/2/27 10:17:27 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产高潮流白浆喷水免费网站 | 国产一区在线观看无码av | 国产av天堂无码一区二区三区 | 国产精品女a片爽爽波多洁 国产精品女a色欲av色欲老师 | 国产精品免费高清在线观看 | 国产成人色欲av在线 | 高潮毛片无遮挡高清免费软件 | 国产成人综合久久亚洲精品 | 成av人片在线观黄桃 | 国产成人精品人人 | 国产无码av | 国产精品传媒99一区二区 | 国产一区二区精品久 | 国产免费又黄有色在线观看 | 精品动漫一区二区无码视频 | 国产做受视频激情播放 | 高清av一级大片 | 18禁黄无遮挡免费网站国产 | 成在人线av无码免费看网站 | 国产日韩欧美一区二区久久精品 | 国产欧美精品国产第一区 | 国产亚洲视频在线观看网址 | 国产成人精品毛片曰本亚洲 | 国产成人av一区二区三区在线观看 | 国产激情无码一区二区app | 国产精品九九久久精 | 国产激情一区二区三区在线观看 | 91精品国产八戒影视 | 国产精品一区二区三区四区五区 | 国产精品边做奶水狂喷无码 | 黄色视频亚洲一区二区无码真爽 | 国产精品无码日韩主播 | 成人午夜福| 精品亚洲av乱码一区二区 | 国产色视频一区二区三区四区 | av午夜福利不 | 91免费人成网站在线观看18 | 国产精品国产三级国产 | 国产精品一级特黄毛片 | 国产成人yy精品1024在线 | 3d动漫精品啪啪一区二区中文 |