winform自动更新程序扫盲贴
自动更新 我直接简单明了的说干的 虚的就不整那么多了 类似这样
[attach]75042[/attach]
思路是一个客户端一个主程序exe 自动更新程序exe 上图
[ 本帖最后由 wangnannan 于 2014-3-10 10:35 编辑 ]

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
using System; using System.Collections.Generic; using using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Update; using System.Threading; using using System.Runtime.InteropServices; namespace autoUpdate { public partial class Form1 : Form { [DllImport("zipfile.dll")] public static extern int MyZip_ExtractFileAll(string zipfile, string pathname); public Form1() { InitializeComponent(); //清除之前下载来的rar文件 if (File.Exists(Application.StartupPath + "\\Update_autoUpdate.rar")) { try { File.Delete(Application.StartupPath + "\\Update_autoUpdate.rar"); } catch (Exception) { } } if (Directory.Exists(Application.StartupPath + "\\autoupload")) { try { Directory.Delete(Application.StartupPath + "\\autoupload", true); } catch (Exception) { } } //检查服务端是否有新版本程序 checkUpdate(); timer1.Enabled = true; } SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "xinDianClient"); public void checkUpdate() { app.UpdateFinish += new UpdateState(app_UpdateFinish); try { if (app.IsUpdate) { app.Update(); } else { MessageBox.Show("未检测到新版本!"); Application.Exit(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } void app_UpdateFinish() { //解压下载后的文件 string path = app.FinalZipName; if (File.Exists(path)) { //后改的 先解压滤波zip植入ini然后再重新压缩 string dirEcgPath = Application.StartupPath + "\\" + "autoupload"; if (!Directory.Exists(dirEcgPath)) { Directory.CreateDirectory(dirEcgPath); } //开始解压压缩包 MyZip_ExtractFileAll(path, dirEcgPath); try { //复制新文件替换旧文件 DirectoryInfo TheFolder = new DirectoryInfo(dirEcgPath); foreach (FileInfo NextFile in TheFolder.GetFiles()) { File.Copy(NextFile.FullName, Application.StartupPath + "\\program\\" + NextFile.Name, true); } Directory.Delete(dirEcgPath,true); File.Delete(path); //覆盖完成 重新启动程序 path = Application.StartupPath + "\\program"; System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = "xinDianClient.exe"; process.StartInfo.WorkingDirectory = path;//要掉用得exe路径例如:"C:\windows"; process.StartInfo.CreateNoWindow = true; process.Start(); Application.Exit(); } catch (Exception) { MessageBox.Show("请关闭系统在执行更新操作!"); Application.Exit(); } } } private void timer1_Tick(object sender, EventArgs e) { label2.Text = "下载文件进度:" + () + "%"; if (100) { timer1.Enabled = false; } } } }
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using using using System.Xml; using COMMON; namespace Update { /// <summary> /// 更新完成触发的事件 /// </summary> public delegate void UpdateState(); /// <summary> /// 程序更新 /// </summary> public class SoftUpdate { private string download; private const string updateUrl = "http://33.8.11.117:8019/update.xml";//升级配置的XML文件地址 #region 构造函数 public SoftUpdate() { } /// <summary> /// 程序更新 /// </summary> /// <param name="file">要更新的文件</param> public SoftUpdate(string file, string softName) { this.LoadFile = file; this.SoftName = softName; } #endregion #region 属性 private string loadFile; private string newVerson; private string softName; private bool isUpdate; /// <summary> /// 或取是否需要更新 /// </summary> public bool IsUpdate { get { checkUpdate(); return isUpdate; } } /// <summary> /// 要检查更新的文件 /// </summary> public string LoadFile { get { return loadFile; } set { loadFile = value; } } /// <summary> /// 程序集新版本 /// </summary> public string NewVerson { get { return newVerson; } } /// <summary> /// 升级的名称 /// </summary> public string SoftName { get { return softName; } set { softName = value; } } private string _finalZipName = string.Empty; public string FinalZipName { get { return _finalZipName; } set { _finalZipName = value; } } #endregion /// <summary> /// 更新完成时触发的事件 /// </summary> public event UpdateState UpdateFinish; private void isFinish() { if (UpdateFinish != null) UpdateFinish(); } /// <summary> /// 下载更新 /// </summary> public void Update() { try { if (!isUpdate) return; WebClient wc = new WebClient(); string filename = ""; string exten = download.Substring(download.LastIndexOf(".")); if (loadFile.IndexOf(@"\") == -1) filename = "Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten; else filename = Path.GetDirectoryName(loadFile) + "\\Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten; FinalZipName = filename; //wc.DownloadFile(download, filename); wc.DownloadFileAsync(new Uri(download), filename); wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged); wc.DownloadFileCompleted += new (wc_DownloadFileCompleted); //wc.Dispose(); } catch { throw new Exception("更新出现错误,网络连接失败!"); } } void wc_DownloadFileCompleted(object sender, e) { (sender as WebClient).Dispose(); isFinish(); } void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { CommonMethod.autostep = e.ProgressPercentage; } /// <summary> /// 检查是否需要更新 /// </summary> public void checkUpdate() { try { WebClient wc = new WebClient(); Stream stream = wc.OpenRead(updateUrl); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(stream); XmlNode list = xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in list) { if (node.Name == "Soft" && node.Attributes["Name"].Value.ToLower() == SoftName.ToLower()) { foreach (XmlNode xml in node) { if (xml.Name == "Verson") newVerson = xml.InnerText; else download = xml.InnerText; } } } Version ver = new Version(newVerson); Version verson = Assembly.LoadFrom(loadFile).GetName().Version; int tm = (ver); if (tm >= 0) isUpdate = false; else isUpdate = true; } catch (Exception ex) { throw new Exception("更新出现错误,请确认网络连接无误后重试!"); } } /// <summary> /// 获取要更新的文件 /// </summary> /// <returns></returns> public override string ToString() { return this.loadFile; } } }
[STAThread] static void Main() { if (checkUpdateLoad()) { Application.Exit(); return; } //执行打开主窗体之类的代码。。。。 } public static bool checkUpdateLoad() { bool result = false; SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "xinDianClient"); try { if (app.IsUpdate && MessageBox.Show("检查到新版本,是否更新?", "版本检查", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { string path = Application.StartupPath.Replace("program", ""); System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = "autoUpdate.exe"; process.StartInfo.WorkingDirectory = path;//要掉用得exe路径例如:"C:\windows"; process.StartInfo.CreateNoWindow = true; process.Start(); result = true; } else { result = false; } } catch (Exception ex) { MessageBox.Show(ex.Message); result = false; } return result; }
<?xml version="1.0" encoding="utf-8" ?> <Update> <Soft Name="update"> <Verson>1.0.0.3</Verson> <DownLoad>http://33.8.11.117:8079/update.rar</DownLoad> </Soft> </Update>