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

639 lines
24 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 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;
using RunUpdateExe.Lib;
using Oracle.ManagedDataAccess.Client;
using System.Configuration;
using System.Security.Cryptography;
namespace RunUpdateExe
{
public partial class MainForm : Form
{
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();
/// <summary>
/// 消息处理类申明
/// </summary>
private static ClassMessage classMsg = new ClassMessage();
private static ClassCheckProIsRun classCPIR = new ClassCheckProIsRun();
private static bool boolUpdateFalg = false;
#region ->
WaiteFrom _WaitForm = null;
#endregion
#region ->
private static string strUpdaterProPath = Application.StartupPath + @"AutoUpdateEx.exe";
#endregion
#region ->
public MainForm()
{
InitializeComponent();
//初始化对应的进度窗口
ShowWaiteForm();
Init();
_WaitForm.ShowMessage("加载完成...");
_WaitForm.Visible = true;
Application.DoEvents();
}
#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);
string xmlPath = CommonHelper.strUpdateURL + ConfigHelper.strUpdateListXmlPath;
WebRequest myRequest = WebRequest.Create(xmlPath);
WebResponse myResponse = myRequest.GetResponse();
myResponse.Close();
//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();
System.Environment.Exit(0);
}
//}
// else
// {
// //StartApplication();
// ClassLog.WriteLog("IPStatus", "网络连接失败");
// System.Environment.Exit(0);
// }
}
catch (Exception ex)
{
ClassLog.WriteLog("Init", ex.Message);
//StartApplication();
System.Environment.Exit(0);
}
}
#endregion
/// <summary>
/// 启动程序
/// </summary>
private void StartApplication()
{
StartProc(CommonHelper.strStartApp.Split('|'));
StartProc(ConfigHelper.ConnectPointExe);
System.Environment.Exit(0);
}
void timer1_Tick(object sender, EventArgs e)
{
if (FinishDownLoad)
{
//StartApplication();
//完成下载,关闭当前进程
if (boolUpdateFalg == true)
buildUpdateListXml(getUpdateList(GetAllFilesInDirectory(ConfigHelper.strUpdateFilesPath)));
System.Environment.Exit(0);
}
}
private void checkUpdate()
{
string serverpartcode = "";
string LastUpdate = CommonHelper.strLastUpdateDate;
string ServerUpdate = CommonHelper.getServerUpdateTime();
string[] UpdateServerPart = CommonHelper.getUpadateServerPart();
//string ConnStr = "Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost )(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORCL))); User ID=highway_exchange; PassWord=qrwl";
string ConnStr = GetConnectionStringsConfig("orcl");
OracleConnection conn = new OracleConnection(ConnStr);
conn.Open();
string sqlca = "select serverpartcode from highway_exchange.t_syscode order by serverpartcode";
OracleCommand syscode = new OracleCommand(sqlca, conn);
OracleDataReader serverpart = syscode.ExecuteReader();
if (UpdateServerPart.Contains("ALL"))
{
boolUpdateFalg = true;
}
else
{
if (serverpart.HasRows)
{
while (serverpart.Read())
{
serverpartcode = serverpart["SERVERPARTCODE"].ToString();
foreach (string str in serverpartcode.Split('|'))
{
if (UpdateServerPart.Contains(str))
{
boolUpdateFalg = true;
}
}
}
}
}
conn.Close();
conn.Dispose();
if (!String.IsNullOrEmpty(ServerUpdate) && !String.IsNullOrEmpty(LastUpdate) && boolUpdateFalg) //日期都不为空
{
if (DateTime.Compare(
Convert.ToDateTime(ServerUpdate, CultureInfo.InvariantCulture),
Convert.ToDateTime(LastUpdate, CultureInfo.InvariantCulture)) > 0) //字符转日期,并比较日期大小
{
//if (UpdateServerPart.Contains(serverpartcode))
//{
boolUpdateFalg = true; //本次更新日期 大于 最近一次更新日期,有更新,修改更新标记
//}
}
else
{
boolUpdateFalg = false;
}
}
}
#region UpdateApplication
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
#region ->
/// <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);
XElement xeRoot = oXDoc.Root;
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;
}
}
#endregion
#region ->
/// <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 + ReNameFileName))
{
//备份当前时间
if (File.Exists(ConfigHelper.strBackupPath + SysDateString + ReName))
File.Delete(ConfigHelper.strBackupPath + SysDateString + ReName);
try
{
File.Move(ConfigHelper.strMainProDir + ReNameFileName, ConfigHelper.strBackupPath + SysDateString + ReName);
}
catch { }
//删除文件
if (File.Exists(ConfigHelper.strMainProDir + ReNameFileName))
File.Delete(ConfigHelper.strMainProDir + ReNameFileName);
}
else if (!Directory.Exists(ConfigHelper.strMainProDir))
{
Directory.CreateDirectory(ConfigHelper.strMainProDir);
}
//下载文件--下载到当前路径
downWebClient.DownloadFileAsync(new Uri(CommonHelper.strUpdateURL + ConfigHelper.strSevUpdateFilesUrl +
strCurFileName.Replace('\\', '/')), ConfigHelper.strMainProDir + ReNameFileName);
}
catch (WebException ex)
{
throw ex;
}
}
#endregion
#region ->
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);
}
}
#endregion
#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 ->
/// <summary>
/// 生成更新配置文件
/// </summary>
/// <param name="strArray"></param>
private void buildUpdateListXml(string[] strArray)
{
#region
////加载xml文档
//XmlDocument doc = new XmlDocument();
//string path = Server.MapPath("~/Title.xml");
//doc.Load(path);
////创建节点
//XmlElement xmlElement = doc.CreateElement("Title");
////添加属性
//xmlElement.SetAttribute("ID", "21");
//xmlElement.SetAttribute("Name", "王六");
////将节点加入到指定的节点下
//XmlNode xml = doc.DocumentElement.PrependChild(xmlElement);
//doc.Save(path);
#endregion
if (strArray != null)
{
try
{
XmlDocument xmlDoc = new XmlDocument();
// 创建根节点AutoUpdater
XmlElement xeRoot = xmlDoc.CreateElement("AutoUpdater");
xmlDoc.AppendChild(xeRoot); // 加入到上层节点
// 创建UpdateInfo元素
XmlElement xeUI = xmlDoc.CreateElement("UpdateInfo");
xeRoot.AppendChild(xeUI);
// 创建UpdateTime元素
XmlElement xeUT = xmlDoc.CreateElement("UpdateTime");
//xeUT.SetAttribute("Date", DateTime.Today.ToShortDateString());
xeUT.SetAttribute("Date", DateTime.Now.ToString());
xeUI.AppendChild(xeUT);
// 创建Version元素
XmlElement xeUV = xmlDoc.CreateElement("Version");
xeUV.SetAttribute("Num", getMainProVer());
xeUI.AppendChild(xeUV);
// 创建UpdateSize元素
XmlElement xeUS = xmlDoc.CreateElement("UpdateSize");
xeUS.SetAttribute("Size", getUpdateSize(GetAllFilesInDirectory(ConfigHelper.strUpdateFilesPath)).ToString());
xeUI.AppendChild(xeUS);
// 创建UpdateFileList元素
XmlElement xeUFL = xmlDoc.CreateElement("UpdateFileList");
xeRoot.AppendChild(xeUFL);
for (int i = 0; i < strArray.Length; i++)
{
// 循环创建UpdateFile元素
XmlElement xeUF = xmlDoc.CreateElement("UpdateFile");
xeUF.SetAttribute("Md5", GetMD5(ConfigHelper.strMainProDir + strArray[i]));
xeUF.InnerText = strArray[i];
xeUFL.AppendChild(xeUF); // 加入到上层节点
}
xmlDoc.Save("UpdateList.xml"); // 保存文件
//classMsg.messageInfoBox("配置文件创建完成!");
}
catch (Exception ex)
{
ClassLog.WriteLog("buildUpdateListXml", ex.Message);
}
return;
}
ClassLog.WriteLog("buildUpdateListXml", "UpdateFiles目录中无更新文件");
}
/// <summary>
/// 获取所有目录即子目录下的文件完整路径列表
/// </summary>
/// <param name="listFileInfo">返回指定目录下的所有文件信息</param>
/// <returns>返回值</returns>
private static string[] getUpdateList(List<FileInfo> listFileInfo)
{
string strRelativePath = null;
string[] strArrayRelativePaths = null;
if (listFileInfo != null)
{
foreach (FileInfo fileInfo in listFileInfo)
{
if (!fileInfo.FullName.Contains("lpk.dll"))
{
strRelativePath += fileInfo.FullName.Replace(ConfigHelper.strUpdateFilesPath, "") + ',';
}
}
if (strRelativePath != null)
{
strArrayRelativePaths = strRelativePath.TrimEnd(',').Split(',');
}
}
return strArrayRelativePaths;
}
/// <summary>
/// 获取所有目录即子目录下的文件总字节大小
/// </summary>
/// <param name="listFileInfo">返回指定目录下的所有文件信息</param>
/// <returns>返回值</returns>
private static long getUpdateSize(List<FileInfo> listFileInfo)
{
long len = 0;
if (listFileInfo != null)
{
foreach (FileInfo fileInfo in listFileInfo)
{
if (fileInfo.Name != "lpk.dll")
{
len += fileInfo.Length;
}
}
}
return len;
}
/// <summary>
/// 返回指定目录下的所有文件信息
/// </summary>
/// <param name="strDirectory"></param>
/// <returns></returns>
public List<FileInfo> GetAllFilesInDirectory(string strDirectory)
{
//判断文件夹是否存在,不存在则退出
if (!Directory.Exists(strDirectory))
return null;
List<FileInfo> listFiles = new List<FileInfo>(); //保存所有的文件信息
DirectoryInfo directory = new DirectoryInfo(strDirectory);
DirectoryInfo[] directoryArray = directory.GetDirectories();
FileInfo[] fileInfoArray = directory.GetFiles();
if (fileInfoArray.Length > 0) listFiles.AddRange(fileInfoArray);
foreach (DirectoryInfo _directoryInfo in directoryArray)
{
DirectoryInfo directoryA = new DirectoryInfo(_directoryInfo.FullName);
DirectoryInfo[] directoryArrayA = directoryA.GetDirectories();
FileInfo[] fileInfoArrayA = directoryA.GetFiles();
if (fileInfoArrayA.Length > 0) listFiles.AddRange(fileInfoArrayA);
GetAllFilesInDirectory(_directoryInfo.FullName);//递归遍历
}
return listFiles;
}
#endregion
/// <summary>
/// 获取主程序文件版本
/// </summary>
/// <returns></returns>
private string getMainProVer()
{
string strProVer = "";
if (File.Exists(ConfigHelper.strMainProDir + "\\cashier.exe")) //如果更新中有主程序
{
FileVersionInfo fviMainPro = FileVersionInfo.GetVersionInfo(ConfigHelper.strMainProDir + "\\cashier.exe");
strProVer = fviMainPro.ProductVersion;
}
else if (File.Exists(ConfigHelper.strMainProDir + "\\cashier.exe.rar"))
{
FileVersionInfo fviMainPro = FileVersionInfo.GetVersionInfo(ConfigHelper.strMainProDir + "\\cashier.exe.rar");
strProVer = fviMainPro.ProductVersion;
}
return strProVer;
}
/// <summary>
/// 依据连接串名字connectionName返回数据连接字符串
/// </summary>
/// <param name="connectionName"></param>
/// <returns></returns>
private static string GetConnectionStringsConfig(string connectionName)
{
string connectionString =
ConfigurationManager.ConnectionStrings[connectionName].ConnectionString.ToString();
Console.WriteLine(connectionString);
return connectionString;
}
/// <summary>
/// 获取指定文件MD5
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private static string GetMD5(string s)
{
try
{
FileStream file = new FileStream(s, FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retval = md5.ComputeHash(file);
file.Close();
StringBuilder sc = new StringBuilder();
for (int i = 0; i < retval.Length; i++)
{
sc.Append(retval[i].ToString("x2"));
}
return sc.ToString().ToUpper();
}
catch (Exception ex)
{
return "";
}
}
}
}