You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
260 lines
7.9 KiB
260 lines
7.9 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Configuration;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Xml;
|
|
using log4net;
|
|
using log4net.Config;
|
|
|
|
namespace update
|
|
{
|
|
class Program
|
|
{
|
|
public static string SmallBackUrl = string.Empty;
|
|
public static string Version = string.Empty;
|
|
public static string CurrentPath = string.Empty;
|
|
public static string UpdateReleasePath = string.Empty;
|
|
public static string FormalPath = string.Empty;
|
|
public static string BackPath = string.Empty;
|
|
//初始化日志
|
|
static protected ILog logger = LogManager.GetLogger(typeof(Program));
|
|
static void Main(string[] args)
|
|
{
|
|
InitConfig();
|
|
InitLog4Net();
|
|
UpdateVersion();
|
|
}
|
|
/// <summary>
|
|
/// 前端版本更新
|
|
/// </summary>
|
|
static public void UpdateVersion()
|
|
{
|
|
|
|
try
|
|
{
|
|
//更新App.config中的版本号
|
|
var config = new ConfigUtils();
|
|
string filepath = SmallBackUrl + @"/update/update.xml";
|
|
//下载更新XML
|
|
WebClient mywebclient = new WebClient();
|
|
string basepath = CurrentPath + "../";
|
|
string downloadPath = basepath + @"update.xml";
|
|
if (!Directory.Exists(CurrentPath + @"/temp/"))
|
|
{
|
|
Directory.CreateDirectory(CurrentPath + @"/temp/");
|
|
}
|
|
mywebclient.DownloadFile(filepath, downloadPath);
|
|
//解析更新XML,读取信息
|
|
XmlDocument xmlDoc = new XmlDocument();
|
|
string xmlString = ReadContext(downloadPath);
|
|
xmlDoc.LoadXml(xmlString);
|
|
var item = xmlDoc.SelectSingleNode("//updateVersion");
|
|
double version = Convert.ToDouble(item.InnerXml);
|
|
string downloadUrl = item.Attributes["name"]?.InnerXml;
|
|
string updatemode = item.Attributes["mode"]?.InnerXml;//更新模式,全量(full),补丁(patch)
|
|
double nowVersion = Convert.ToDouble(Version);
|
|
|
|
if (version == nowVersion)
|
|
{
|
|
WebClient mywebclient2 = new WebClient();
|
|
string filePath2 = SmallBackUrl + @"/update/" + downloadUrl;
|
|
string localPath = CurrentPath + @"\update\" + downloadUrl;
|
|
string downpath = CurrentPath + @"\update\";
|
|
if (!Directory.Exists(downpath))
|
|
Directory.CreateDirectory(downpath);
|
|
UpdateReleasePath = basepath + @"temp/";
|
|
//下载更新包
|
|
mywebclient2.DownloadFile(filePath2, localPath);
|
|
//解压更新包至指定路径
|
|
if (Directory.Exists(UpdateReleasePath))
|
|
{
|
|
DeleteDir(UpdateReleasePath, 1);
|
|
Directory.CreateDirectory(UpdateReleasePath);
|
|
}
|
|
ZipFile.ExtractToDirectory(localPath, UpdateReleasePath);
|
|
string mainpropath = basepath + "MainPro";
|
|
DirectoryInfo di = new DirectoryInfo(mainpropath);//正式包路径
|
|
DirectoryInfo di2 = new DirectoryInfo(UpdateReleasePath);//更新包解压路径
|
|
Thread.Sleep(3000);
|
|
if ("full".Equals(updatemode))
|
|
{
|
|
|
|
DirectoryInfo diback = new DirectoryInfo(mainpropath + DateTime.Now.ToString("yyyyMMddHHmmss"));//正式包路径
|
|
MoveDirectory(di, diback, true); //复制子目录
|
|
}
|
|
|
|
CopyDirectory(di2, di, true); //复制子目录
|
|
}
|
|
config.SetKey("updateVersion", item.InnerXml);
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.Warn("更新版本出错" + ex.Message + "|" + ex.StackTrace);
|
|
}
|
|
string fullName = CurrentPath + "..\\MainPro\\DemoUI.exe";
|
|
var processInfo = new ProcessStartInfo(fullName);
|
|
processInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
processInfo.UseShellExecute = false;
|
|
processInfo.WorkingDirectory = Path.GetDirectoryName(fullName);
|
|
Process.Start(processInfo);
|
|
logger.Debug("应用更新版本结束,启动主程序" + fullName);
|
|
Environment.Exit(1);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化配置文件
|
|
/// </summary>
|
|
public static void InitConfig()
|
|
{
|
|
try
|
|
{
|
|
var config = new ConfigUtils();
|
|
DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
|
|
SmallBackUrl = config.GetKey("HttpUrl");//后台地址
|
|
Version = config.GetKey("updateVersion");//版本号
|
|
CurrentPath = di.FullName;//当前路径
|
|
//UpdateReleasePath = di.FullName + "up";//更新包解压路径
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw e;
|
|
}
|
|
}
|
|
public static bool SetConfig(string Key, string Value)
|
|
{
|
|
try
|
|
{
|
|
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
|
|
if (config.AppSettings.Settings[Key] != null)
|
|
config.AppSettings.Settings[Key].Value = Value;
|
|
else
|
|
config.AppSettings.Settings.Add(Key, Value);
|
|
config.Save(ConfigurationSaveMode.Modified);
|
|
ConfigurationManager.RefreshSection("appSettings");
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
private static void InitLog4Net()
|
|
{
|
|
var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
|
|
XmlConfigurator.ConfigureAndWatch(logCfg);
|
|
}
|
|
|
|
private static string ReadContext(string path)
|
|
{
|
|
FileStream fs = new FileStream(path, FileMode.Open);
|
|
StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);
|
|
string context = sr.ReadToEnd();
|
|
fs.Close();
|
|
sr.Close();
|
|
sr.Dispose();
|
|
fs.Dispose();
|
|
return context;
|
|
}
|
|
|
|
public static void DeleteDir(string srcPath, int isSelf = 0)
|
|
{
|
|
try
|
|
{
|
|
DirectoryInfo dir = new DirectoryInfo(srcPath);
|
|
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录
|
|
foreach (FileSystemInfo i in fileinfo)
|
|
{
|
|
if (i is DirectoryInfo) //判断是否文件夹
|
|
{
|
|
DirectoryInfo subdir = new DirectoryInfo(i.FullName);
|
|
subdir.Delete(true); //删除子目录和文件
|
|
}
|
|
else
|
|
{
|
|
//如果 使用了 streamreader 在删除前 必须先关闭流 ,否则无法删除 sr.close();
|
|
File.Delete(i.FullName); //删除指定文件
|
|
}
|
|
}
|
|
if (isSelf == 1)
|
|
{
|
|
dir.Delete();
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
logger.Error(e.Message);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 拷贝目录内容
|
|
/// </summary>
|
|
/// <param name="source">源目录</param>
|
|
/// <param name="destination">目的目录</param>
|
|
/// <param name="copySubDirs">是否拷贝子目录</param>
|
|
public static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination, bool copySubDirs)
|
|
{
|
|
|
|
if (!destination.Exists)
|
|
{
|
|
destination.Create(); //目标目录若不存在就创建
|
|
}
|
|
FileInfo[] files = source.GetFiles();
|
|
foreach (FileInfo file in files)
|
|
{
|
|
file.CopyTo(Path.Combine(destination.FullName, file.Name), true); //复制目录中所有文件,替换相同文件
|
|
}
|
|
if (copySubDirs)
|
|
{
|
|
DirectoryInfo[] dirs = source.GetDirectories();
|
|
foreach (DirectoryInfo dir in dirs)
|
|
{
|
|
string destinationDir = Path.Combine(destination.FullName, dir.Name);
|
|
CopyDirectory(dir, new DirectoryInfo(destinationDir), copySubDirs); //复制子目录
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 拷贝目录内容,删除本身
|
|
/// </summary>
|
|
/// <param name="source">源目录</param>
|
|
/// <param name="destination">目的目录</param>
|
|
/// <param name="copySubDirs">是否拷贝子目录</param>
|
|
public static void MoveDirectory(DirectoryInfo source, DirectoryInfo destination, bool copySubDirs)
|
|
{
|
|
if (!destination.Exists)
|
|
{
|
|
destination.Create(); //目标目录若不存在就创建
|
|
}
|
|
FileInfo[] files = source.GetFiles();
|
|
foreach (FileInfo file in files)
|
|
{
|
|
file.CopyTo(Path.Combine(destination.FullName, file.Name), true); //复制目录中所有文件,替换相同文件
|
|
file.Delete();
|
|
}
|
|
|
|
if (copySubDirs)
|
|
{
|
|
DirectoryInfo[] dirs = source.GetDirectories();
|
|
|
|
foreach (DirectoryInfo dir in dirs)
|
|
{
|
|
string destinationDir = Path.Combine(destination.FullName, dir.Name);
|
|
MoveDirectory(dir, new DirectoryInfo(destinationDir), copySubDirs); //复制子目录
|
|
}
|
|
if (source.GetDirectories().Length == 0)
|
|
source.Delete();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|