2025-03-28 09:49:56 +08:00

389 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoUpdateEx;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
namespace RunUpdateExe
{
public partial class MainForm : Form
{
#region ->
WaiteFrom _WaitForm = null;
#endregion
string strCurFileName = ""; //当前在下载的文件名
private static long SIZE; //总下载大小
private static long UPSIZE; //已经上传多少
private static int NUM; //已经更新件数
private static string[] strArrayFileNames; //需要下载的文件名
private static long lngCurFileSize;
private static bool FinishDownLoad = false;
string strCurPath = "";
WebClient downWebClient = new WebClient();
private static AutoUpdateEx.lib.ClassCheckProIsRun classCPIR = new AutoUpdateEx.lib.ClassCheckProIsRun();
private static bool boolUpdateFalg = false;
#region ->
public MainForm()
{
InitializeComponent();
ShowWaiteForm();
Init();
}
#endregion
#region -> Init()
private void Init()
{
try
{
//重置数据
SetUpHelper.SetReplaceValue("servername", SetUpHelper.GetMachineName());
SetUpHelper.SetReplaceValue("openpath", "");
//杀死程序
classCPIR.KillExe(ConfigHelper.ConnectPointExe);
classCPIR.KillExe(CommonHelper.GetKillAppList);
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
options.DontFragment = true;
string data = "";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 1000;
PingReply reply = pingSender.Send(CommonHelper.strIP, timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
//检查更新
_WaitForm.ShowMessage("正在检查更新...");
Application.DoEvents();
checkUpdate();
//更新完成,书写日期
_WaitForm.ShowMessage("检查更新完成...");
Application.DoEvents();
_WaitForm.Visible = true;
if (boolUpdateFalg == true)
{
//杀死进程
classCPIR.KillExe(CommonHelper.GetKillAppList);
_WaitForm.ShowMessage("启动更新程序...");
Application.DoEvents();
//直接启动更新--杀死进程
UpdateApplication();
_WaitForm.ShowMessage("正在更新...");
Application.DoEvents();
timer1.Interval = 1000;//一秒钟检索一次
timer1.Tick += timer1_Tick;
timer1.Start();
_WaitForm.Visible = true;
Application.DoEvents();
}
else
{
StartApplication();
}
}
else
{
StartApplication();
}
}
catch (Exception ex)
{
StartApplication();
}
}
/// <summary>
/// 启动程序
/// </summary>
private void StartApplication()
{
try
{
StartProc(CommonHelper.strStartApp.Split('|'));
StartProc(ConfigHelper.ConnectPointExe);
}
catch { }
System.Environment.Exit(0);
}
void timer1_Tick(object sender, EventArgs e)
{
if (FinishDownLoad)
{
StartApplication();
//完成下载,关闭当前进程
System.Environment.Exit(0);
}
}
private void checkUpdate()
{
string LastUpdate = CommonHelper.strLastUpdateDate;
string ServerUpdate = CommonHelper.getServerUpdateTime();
if (!String.IsNullOrEmpty(ServerUpdate) && !String.IsNullOrEmpty(LastUpdate)) //日期都不为空
{
if (DateTime.Compare(
Convert.ToDateTime(ServerUpdate, CultureInfo.InvariantCulture),
Convert.ToDateTime(LastUpdate, CultureInfo.InvariantCulture)) > 0) //字符转日期,并比较日期大小
{
boolUpdateFalg = true; //本次更新日期 大于 最近一次更新日期,有更新,修改更新标记
}
}
}
private void UpdateApplication()
{
//关闭程序
//委托下载数据时事件
downWebClient.DownloadProgressChanged += delegate (object wcsender, DownloadProgressChangedEventArgs ex)
{
string ShowString = String.Format(
CultureInfo.InvariantCulture,
"正在下载:{0} [ {1}/{2} ]",
strCurFileName,
CommonHelper.convertSize(ex.BytesReceived),
CommonHelper.convertSize(ex.TotalBytesToReceive));
//呈现内容
lngCurFileSize = ex.TotalBytesToReceive;
};
//委托下载完成时事件
downWebClient.DownloadFileCompleted += delegate (object wcsender, AsyncCompletedEventArgs ex)
{
if (ex.Error != null)
{
_WaitForm.ShowMessage(ex.Error.Message);
_WaitForm.Visible = true;
Application.DoEvents();
}
else
{
UPSIZE += lngCurFileSize;
if (strArrayFileNames.Length > NUM)
{
downloadFile(NUM);
}
else
{
//更新本地xml
CommonHelper.setConfigValue(ConfigHelper.strUpdateXmlPath, "UpDate", CommonHelper.getServerUpdateTime());
//启动程序
FinishDownLoad = true;
}
}
};
SIZE = CommonHelper.getUpdateSize(CommonHelper.strUpdateURL + ConfigHelper.strUpdateListXmlPath);
if (SIZE == 0) //判断要更新的文件是否有大小如果为0字节则结束更新
throw new Exception("更新大小为0");
NUM = 0;
UPSIZE = 0;
updateList();
string abc = "";
//foreach(string str in strArrayFileNames)
//{
// abc += str;
//}
//MessageBox.Show(abc);
if (strArrayFileNames != null)
downloadFile(0);
}
#endregion
/// <summary>
/// 获取文件列表并赋给全局变量
/// </summary>
private static void updateList()
{
string xmlPath = CommonHelper.strUpdateURL + ConfigHelper.strUpdateListXmlPath;
WebClient wc = new WebClient();
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
try
{
StringBuilder sb = new StringBuilder();
XDocument oXDoc = XDocument.Load(xmlPath);
System.Xml.Linq.XElement xeRoot = oXDoc.Root;
System.Xml.Linq.XElement xele = xeRoot.Element("UpdateFileList");
foreach (var ele in xele.Elements())
{
if (sb.Length == 0)
{
sb.Append(ele.Value);
}
else
{
sb.Append("," + ele.Value);
}
}
strArrayFileNames = sb.ToString().Split(','); //赋给全局变量
}
catch (WebException ex)
{
throw ex;
}
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="arry">下载序号</param>
private void downloadFile(int arry)
{
try
{
NUM++; //全局变量来记录下载的文件序号
string ReName = "";
strCurFileName = strArrayFileNames[arry];
ReName = strCurFileName;
//如果对应的文件经过处理
if (strCurFileName.EndsWith(".rar"))
{
ReName = strCurFileName.Substring(0, strCurFileName.LastIndexOf(".rar"));
//ReName = strCurFileName.Replace(".exe.rar", ".exe").Replace(".pbd.rar", ".pbd");
}
string strFileName = strCurFileName.Substring(strCurFileName.LastIndexOf("\\") + 1); //截取文件名
string ReNameFileName = ReName.Substring(ReName.LastIndexOf("\\") + 1);
strCurPath = strCurFileName.Substring(0, strCurFileName.LastIndexOf("\\") + 1); //截取文件路径
string StrCurReNamePath = ReName.Substring(0, ReName.LastIndexOf("\\") + 1);
string SysDateString = System.DateTime.Now.ToString("yyyyMMdd");
//创建备份日期+更新文件目录
if (!Directory.Exists(ConfigHelper.strBackupPath + SysDateString + StrCurReNamePath)) //路径是否存在
{
CommonHelper.createMultipleFolders(ConfigHelper.strBackupPath, SysDateString + StrCurReNamePath); //创建多层目录
}
//备份对应的文件--
if (File.Exists(ConfigHelper.strMainProDir + ReName))
{
//备份当前时间
if (File.Exists(ConfigHelper.strBackupPath + SysDateString + ReName))
File.Delete(ConfigHelper.strBackupPath + SysDateString + ReName);
try
{
File.Move(ConfigHelper.strMainProDir + ReName, ConfigHelper.strBackupPath + SysDateString + ReName);
}
catch
{ }
//删除文件
if (File.Exists(ConfigHelper.strMainProDir + ReName))
File.Delete(ConfigHelper.strMainProDir + ReName);
}
//下载文件--下载到当前路径
downWebClient.DownloadFileAsync(new Uri(CommonHelper.strUpdateURL + ConfigHelper.strSevUpdateFilesUrl +
strCurFileName.Replace('\\', '/')), ConfigHelper.strMainProDir + ReName);
}
catch (WebException ex)
{
throw ex;
}
}
#region ->
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(false);
}
#endregion
#region ->
public void ShowWaiteForm()
{
_WaitForm = WaiteFrom.GetInstance();
//设置WaitForm的父窗体为当前窗体以便在WaitForm中使用父窗体对象
_WaitForm.Owner = this;
_WaitForm.ShowMessage("加载中......");
_WaitForm.Show();
Application.DoEvents();
_WaitForm.Refresh();
}
#endregion
#region ->
private void AddConnectPoint()
{
foreach (string Str in File.ReadLines("setup.ini"))
{
if (Str.Contains("="))
{
if (Str.Split('=')[0] == "")
{
}
}
}
//打开文件
//IEnumerable<string> ReadLines(string path);
//string OpenPoint = "INSERT INTO T_OPENPOINT"
}
#endregion
#region ->
private void GetSumRevenue()
{
}
#endregion
public void StartProc(string ProcName)
{
bool IsRun = false;
Process[] processes = Process.GetProcessesByName(ProcName.Substring(0, ProcName.LastIndexOf('.'))); //同程序名的所有进程
foreach (Process p in processes)//判断当前进程中是否已有该程序
{
if (p.MainModule.ModuleName == ProcName)//通过程序路径判断,而不能通过程序名判断
{
string strVN = p.MainModule.FileVersionInfo.FileVersion; //获取进程中正在运行的这个程序的版本号
p.Kill(); // 结束进程
}
}
//启动程序
Process.Start(ProcName);
}
public void StartProc(string[] ProcNames)
{
foreach (string str in ProcNames)
{
StartProc(str);
}
}
}
}