用C#實現在線升級
//這是一個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);
}
}