当前位置:首页>>开发编程>>VS.NET>>新闻内容  
C#下实现程序在线升级的方法
作者: 发布时间:2007-11-24 16:09:43 | 【字体:

这是一个webservice

private AppUpdate.UpdateServ  UpdateSvr;

  private void button1_Click(object sender, System.EventArgs e)
  {
   
   if(LinkWebServices()==true)
   {
    this.label1.Text="连接服务器....... PASS";
   
    if(CheckVer()==true)
    {
     this.label2.Text="检查最新版本并下载.......PASS";
                  
    }
    else
    {
     this.label2.Text="检查最新版本并下载.......FAIL";
    }
   }
   else
   {
    this.label1.Text="连接服务器.......FAIL";
   }
  }

//这是用来与升级服务器建立连接
  private bool LinkWebServices()
  {
   try
   {
    UpdateSvr=new UpdateServ();
    return true;
   }
   catch
   {
    return false;
   }
  }

//调用webservice用来检查是不是有最新的版本
  private bool CheckVer()
  {
   string path =Application.StartupPath;
   try
   {
    VersionCheck(path);
    return true;
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.ToString());
    return false;
   }
  }

  private void VersionCheck(string desPath)
  {
   try
   {
    #region 查看文件和目录
    if(!desPath.EndsWith(@"\"))
     desPath += @"\";

    if(!System.IO.Directory.Exists(desPath))
    {
     System.IO.Directory.CreateDirectory(desPath);
    }

    string tempPath = desPath + @"tempDesPathCache\";

    if(System.IO.Directory.Exists(tempPath))
    {
     System.IO.Directory.Delete(tempPath,true);
     System.IO.Directory.CreateDirectory(tempPath);
    }
    else
     System.IO.Directory.CreateDirectory(tempPath);

    if(!System.IO.File.Exists(desPath + "UpdateConfig.xml"))
    {
     System.Xml.XmlDocument updateConfig = new System.Xml.XmlDocument();
     updateConfig.LoadXml(@"<root></root>");
     updateConfig.Save(desPath + "UpdateConfig.xml");
    }
    #endregion

  
    System.Xml.XmlDocument serverXmlDoc = UpdateSvr.AppUpdateVertion();
    System.Xml.XmlDocument localXmlDoc = new System.Xml.XmlDocument();
    localXmlDoc.Load(desPath + "UpdateConfig.xml");
    bool newVersionExist = false;
    bool moduleExist = false;
    System.Xml.XmlNode serverNode0 = serverXmlDoc.ChildNodes[0];
    System.Xml.XmlNode localNode0 = localXmlDoc.ChildNodes[0];
    foreach(System.Xml.XmlNode serverNode in serverNode0)
    {
     moduleExist = false;
     foreach(System.Xml.XmlNode localNode in localNode0)
     {
      //找到对应模块
      if(localNode.ChildNodes[0].InnerText == serverNode.ChildNodes[0].InnerText)
      {
       moduleExist = true;
       //版本号判断
       if(localNode.ChildNodes[1].InnerText.CompareTo(serverNode.ChildNodes[1].InnerText) < 0)
       {
        newVersionExist = true;
        if(System.Configuration.ConfigurationSettings.AppSettings["NetStyle"].ToString()=="internet")
        {
         DownloadFile(serverNode.ChildNodes[2].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);
        }
        else
        {
         DownloadFile(serverNode.ChildNodes[3].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);
        }
       }
       break;
      }
     }
     //没找到对应模块
     if(false == moduleExist)
     {
     
      if(System.Configuration.ConfigurationSettings.AppSettings["NetStyle"].ToString()=="internet")
      {
       DownloadFile(serverNode.ChildNodes[2].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);
      }
      else
      {
       DownloadFile(serverNode.ChildNodes[3].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);
      }
     }
    }
    //写入新UpdateConfig.xml升级完毕后替换
    if(newVersionExist)
    {
     serverXmlDoc.Save(tempPath + "UpdateConfig.xml");
     if(DialogResult.Yes == MessageBox.Show("有新版本,是否更新?","提示",MessageBoxButtons.YesNo))
     {
      string[] dirs = System.IO.Directory.GetFiles(tempPath, "*.*");
      string fileName;
      foreach (string dir in dirs)
      {
       fileName = ((dir.Split(Convert.ToChar(@"\")))[dir.Split(Convert.ToChar(@"\")).Length - 1]);
       if(System.IO.File.Exists(desPath + fileName))
       {
        //TODO:可以支持备份以前版本
        System.IO.File.Delete(desPath + fileName);
       }
       //TODO:如果系统正在运行,您得停止系统,至于如何停止,也许可以使用System.Diagnostics.Process
       System.IO.File.Move(dir,desPath + fileName);
      }
      MessageBox.Show("升级完毕");
     }
     else
     {
      //TODO:可以支持重新提示升级
     }
    }
   }
   catch(Exception ex)
   {
    throw new Exception("升级失败,原因是:" + ex.Message,ex);
   }
  }

//下载最新的文件

  private void DownloadFile(string source,string fileName)
  {
   try
   {
    System.Net.WebClient myWebClient = new System.Net.WebClient();
    myWebClient.DownloadFile(source,fileName);
   }
   catch(Exception ex)
   {
    throw new Exception("下载失败,原因是:" + ex.Message,ex);
   }
  }


文章来源:
·C#的支付宝Payto接口代码
·C#实现窗口最小化到系统托盘
·解密QQ的MsgEx.db消息文件格式
·QQ的TEA填充算法C#实现
·C#用Guid获取不规则的唯一值(标识)
·基于Windows Mobile 5.0的掌上天气预报设计
·C#发送Email邮件三种方法的总结
·C#格式化数值结果表(格式化字符串)
·教你用C#开发智能手机游戏:推箱子
 放生
 愚爱
 够爱
 触电
 白狐
 葬爱
 光荣
 画心
 火花
 稻香
 小酒窝
 下雨天
 右手边
 安静了
 魔杰座
 你不像她
 边做边爱
 擦肩而过
 我的答铃
 怀念过去
 等一分钟
 放手去爱
 冰河时代
 你的承诺
 自由飞翔
 原谅我一次
 吻的太逼真
 左眼皮跳跳
 做你的爱人
 一定要爱你
 飞向别人的床
 爱上别人的人
 感动天感动地
 心在跳情在烧
 玫瑰花的葬礼
 有没有人告诉你
 即使知道要见面
 爱上你是一个错
 最后一次的温柔
 爱上你是我的错
 怎么会狠心伤害我
 不是因为寂寞才想
 亲爱的那不是爱情
 难道爱一个人有错
 寂寞的时候说爱我