| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Security.Cryptography;
- using System.Text;
- //----------------------------------------------------------------
- //Module Name: $safeprojectname$
- //Purpose:
- //CopyRight: Muchinfo
- //History:
- //----------------------------------------------------------------
- //DateTime 2016/1/5 15:51:07
- //Author
- //Description Create
- //----------------------------------------------------------------
- using System.Windows;
- using System.Windows.Controls;
- namespace Muchinfo.MTPClient.Update
- {
- public class UpdateManage
- {
- private const string resource = "Config";
- private const string DefaultFolder = "DefaultFolder";
- private const string c_chartUpdateFile = "FinancePrice.dll"; ////图表控件
- private const string c_chartRegitFile = "regchart.bat";///注册图表控件的文件路径
- ///图表路径目录
- public static string ChartPathDir
- {
- get
- {
- return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "COM");
- }
- }
-
- /// <summary>
- /// 是否有图表更新
- /// </summary>
- public static bool IsChartUpdate { get; set; }
-
- /// <summary>
- /// 执行判断更新
- /// </summary>
- /// <param name="updateBasePath">更新服务的路径</param>
- public static UpdateInfo RunUpdate(string updatePath, string memberCode)
- {
-
- UpdateInfo remoteInfo;
- string parentPath = AppDomain.CurrentDomain.BaseDirectory;
- var localFileInfo = LoadLocalConfig();
- bool mainUpdate = CheckMainAppUpdate(updatePath, memberCode, localFileInfo, out remoteInfo);
- if (mainUpdate)
- {
- var tipWindow = new TipsWindow("检测到交易端有新版本是否更新?");
- var result = tipWindow.ShowDialog();
- // var result = MessageBox.Show(" 检测到交易端有新版本是否更新?","更新提示" , MessageBoxButton.YesNo);
- if (result == true)
- {
- var processes = Process.GetProcessesByName(remoteInfo.StartAppName.Replace(".exe", string.Empty));
- foreach (var process in processes)
- {
- process.Kill();
- }
- return remoteInfo;
- }
- }
- return null;
- }
- /// <summary>
- /// 加载本地配置文件,如不存在则生成
- /// </summary>
- /// <returns></returns>
- public static UpdateInfo LoadLocalConfig()
- {
- var updateHelper = new UpdateHelper();
- UpdateInfo updateInfo;
- string parentPath = AppDomain.CurrentDomain.BaseDirectory;
- var configPath = string.Format("{0}\\{1}.xml", parentPath, typeof(UpdateInfo).Name);
- if (File.Exists(configPath)) //本地更新配置文件存在
- {
- updateInfo =
- updateHelper.LoadUpdateConfig(configPath); //todo:读取失败应生成
- }
- else
- {
- updateInfo = updateHelper.CreateUpdateInfoFile(parentPath);
- }
- return updateInfo;
- }
- /// <summary>
- /// 检查主程序有没有更新
- /// </summary>
- /// <param name="updatePath">更新基目录文件</param>
- /// <param name="localConfigExists">是否有本地配置</param>
- /// <param name="updateInfo">服务端更新配置</param>
- /// <returns></returns>
- public static bool CheckMainAppUpdate(string updatePath, string memberCode, UpdateInfo localfileInfo, out UpdateInfo updateFileInfo)
- {
- updateFileInfo = new UpdateInfo();
- var updateHelper = new UpdateHelper();
- var remoteFileInfo = updateHelper.LoadUpdateConfig(string.Format("{0}/{1}.xml", updatePath, typeof(UpdateInfo).Name));
- if (remoteFileInfo.UpdateFiles == null || !remoteFileInfo.UpdateFiles.Any())
- {
- return false;
- }
- var memberPath = string.Empty;
- if (!string.IsNullOrEmpty(remoteFileInfo.ResourceDir)) ////没有个性化资源
- {
- if (string.IsNullOrWhiteSpace(memberCode)) ////没有会员代码
- {
- var resourceDir = Path.Combine(remoteFileInfo.ResourceDir, ""); ////过滤会员资源
- remoteFileInfo.UpdateFiles =
- remoteFileInfo.UpdateFiles.Where((item) => item.FilePath.StartsWith(resourceDir)).ToList();
- }
- else
- {
- memberPath = Path.Combine(remoteFileInfo.ResourceDir, memberCode); ////取会员资源
- var updateFiles = new List<UpdateFile>();
- foreach (var item in updateFileInfo.UpdateFiles)
- {
- if (item.FilePath.StartsWith(memberPath))
- {
- updateFiles.Add(item);
- }
- }
- remoteFileInfo.UpdateFiles = updateFiles;
- }
- }
- if (localfileInfo == null || localfileInfo.UpdateFiles == null || !localfileInfo.UpdateFiles.Any()) ////本地没有文件
- {
- updateFileInfo = remoteFileInfo;
- return true;
- }
- else
- {
- ////todo:比较文件MD5。生成升级的文件列表
- remoteFileInfo.UpdateFiles = CompareUpdateFile(remoteFileInfo, localfileInfo, memberPath);
- updateFileInfo = remoteFileInfo;
- #if DEBUG
- UpdateHelper.SaveStaticUpdateXml(updateFileInfo, AppDomain.CurrentDomain.BaseDirectory + "\\test.xml");
- #endif
- return remoteFileInfo.UpdateFiles.Any(); ////是否有更新的文件
- }
- }
- /// <summary>
- /// /
- /// </summary>
- /// <param name="serverInfo"></param>
- /// <param name="localinfo"></param>
- /// <param name="memberPath">会员代码前的升级文件</param>
- /// <returns></returns>
- public static List<UpdateFile> CompareFileResourceUpdate(UpdateInfo serverInfo, UpdateInfo localinfo,
- string memberPath)
- {
- var localFilesInfo = localinfo.UpdateFiles.ToDictionary((file) => file.FilePath);
- var serverfilesInfo = serverInfo.UpdateFiles.ToDictionary((item) => item.FilePath);
- var updateFiles = new List<UpdateFile>();
- foreach (var fileKey in serverfilesInfo.Keys)
- {
- if (localFilesInfo.ContainsKey(fileKey))
- {
- if (!serverfilesInfo[fileKey].MD5Code.Equals(localFilesInfo[fileKey].MD5Code,StringComparison.InvariantCultureIgnoreCase))
- {
- updateFiles.Add(serverfilesInfo[fileKey]);
- }
- }
- else
- {
- updateFiles.Add(serverfilesInfo[fileKey]);
- }
- }
- return updateFiles;
- }
- /// <summary>
- /// 比较更新的文件
- /// </summary>
- public static List<UpdateFile> CompareUpdateFile(UpdateInfo serverInfo, UpdateInfo localinfo, string memberPath)
- {
- var localFilesInfo = localinfo.UpdateFiles.ToDictionary((file) => file.FilePath.ToLower());
- var serverfilesInfo = serverInfo.UpdateFiles.ToDictionary((item) => item.FilePath.ToLower());
- ////移除不更新的文件
- var keyItems= serverfilesInfo.Keys.ToList();
- var unUpdateList = UnUpdateList();
- try
- {
- foreach (var unFile in unUpdateList)
- {
- foreach (var keyItem in keyItems)
- {
- var keys = keyItem.Split('\\');
- if (keys.Any())
- {
- var fileNameExit = keys[keys.Length - 1];
- var fileName = fileNameExit.Substring(0, fileNameExit.LastIndexOf('.'));
- if (fileName.Equals(unFile))
- {
- serverfilesInfo.Remove(keyItem);
- continue;
- }
- }
- }
- }
- }
- catch (Exception ex)
- {
- }
- var updateFiles = new List<UpdateFile>();
- #if DEBUG
- UpdateHelper.SaveStaticUpdateXml(localinfo, AppDomain.CurrentDomain.BaseDirectory + "\\localinfo.xml");
- UpdateHelper.SaveStaticUpdateXml(serverInfo, AppDomain.CurrentDomain.BaseDirectory + "\\serverInfo.xml");
- #endif
- foreach (var fileKey in serverfilesInfo.Keys)
- {
- var keyItem = fileKey.ToLower();
- if (!string.IsNullOrWhiteSpace(memberPath))
- {
- keyItem = fileKey.Replace(memberPath, string.Empty); ////会员资源与本地的路径要一致
- }
- if (localFilesInfo.ContainsKey(keyItem.ToLower()))
- {
- if (!serverfilesInfo[keyItem].MD5Code.Equals(localFilesInfo[keyItem].MD5Code, StringComparison.InvariantCultureIgnoreCase))
- {
- updateFiles.Add(serverfilesInfo[keyItem]);
- bool chartUpdate = keyItem.Contains(c_chartUpdateFile.ToLower());
- if (chartUpdate)
- {
- IsChartUpdate = true; ////有图表控件更新
- }
- }
- }
- else
- {
- bool chartUpdate = keyItem.Contains(c_chartUpdateFile.ToLower());
- if (chartUpdate)
- {
- IsChartUpdate = true; ////有图表控件更新
- }
- updateFiles.Add(serverfilesInfo[keyItem]);
- }
- }
- return updateFiles;
- }
- /// <summary>
- /// 计算文件MD5
- /// </summary>
- /// <param name="fileInfo"></param>
- /// <returns></returns>
- public static string GetFileMD5Code(FileInfo fileInfo)
- {
- using (FileStream fs = File.OpenRead(fileInfo.FullName)) //new FileStream(fileInfo.FullName, FileMode.Open))
- {
- System.Security.Cryptography.MD5 md5 = new MD5CryptoServiceProvider();
- byte[] retval = md5.ComputeHash(fs);
- fs.Close();
- var sbBuilder = new StringBuilder();
- for (int i = 0; i < retval.Length; i++)
- {
- sbBuilder.Append(retval[i].ToString("x2"));
- }
- return sbBuilder.ToString().ToUpper();
- }
- }
- /// <summary>
- /// 注册图表控件
- /// </summary>
- public static void RegisterChart()
- {
- if (IsChartUpdate)
- {
- var regPath = Path.Combine(ChartPathDir, c_chartRegitFile);
- if (!File.Exists(regPath))
- {
- var chartfile = Path.Combine(ChartPathDir, c_chartUpdateFile);
- var sbuilder=new StringBuilder();
- sbuilder.AppendLine(string.Format("regsvr32 \"{0}\" /u", chartfile));
- sbuilder.AppendLine(string.Format("regsvr32 \"{0}\" ", chartfile));
-
- using (var fsStream = new FileStream(regPath,FileMode.CreateNew))
- {
- var text = new StreamWriter(fsStream, Encoding.Default);
-
- text.Write(sbuilder.ToString());
- text.Close();
- fsStream.Close();
- }
- }
- var startInfo = new System.Diagnostics.ProcessStartInfo(regPath);
-
- startInfo.WindowStyle = ProcessWindowStyle.Hidden;
- startInfo.UseShellExecute = false;
- startInfo.CreateNoWindow = true;
- //startInfo.StandardOutputEncoding = Encoding.UTF8;
- Process process = Process.Start(startInfo);
- process.WaitForExit(7000);
- // Process process = Process.Start(regPath);
- }
- }
- /// <summary>
- ///不检查更新的文件列表
- /// </summary>
- /// <returns></returns>
- public static List<string> UnUpdateList()
- {
- var updateList = new List<string>();
- updateList.Add("contresxs");
- updateList.Add("errorcodes");
- return updateList;
- }
- }
- }
|