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.
iot/labs/CameraCard/AutoUpdate/UpdateForm.cs

223 lines
8.0 KiB

using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AutoUpdate
{
public partial class UpdateForm : Form
{
private string _file;
private string _fileName;
private string _path;
private CancellationTokenSource _cts = new CancellationTokenSource();
public UpdateForm(string file)
{
InitializeComponent();
this.StartPosition = FormStartPosition.CenterParent;
this.Text += $" v{Assembly.GetExecutingAssembly().GetName().Version.ToString()}";
this._file = file;
this._fileName = Path.GetFileNameWithoutExtension(file);
this._path = Path.GetDirectoryName(file);
}
private void Form1_Load(object sender, EventArgs e)
{
if (MessageBox.Show("是否关闭当前运行实例进行更新?", "升级程序提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
this.button2.Enabled = true;
Task.Run(() =>
{
this.StartUpdate();
});
}
else
{
Application.Exit();
}
}
private void StartUpdate()
{
try
{
var installZipFile = Path.Combine(this._path, "application.zip");
//if (File.Exists(installZipFile))
{
//0.关闭进程
var instances = Process.GetProcessesByName(_fileName);
this.Update(() =>
{
this.log.Text += "开始关闭实例";
this.log.Text += Environment.NewLine;
});
foreach (var item in instances)
{
item.Kill();
}
this.Update(() =>
{
this.log.Text += "关闭实例完成";
this.log.Text += Environment.NewLine;
});
//1.备份原有内容到backup
this.Update(() =>
{
this.log.Text += "开始备份文件";
this.log.Text += Environment.NewLine;
});
var folder = Path.Combine(_path, "backup");
if (Directory.Exists(folder))
{
Directory.Delete(folder, true);
Directory.CreateDirectory(folder);
this.Update(() =>
{
this.log.Text += "删除旧的备份文件完成";
this.log.Text += Environment.NewLine;
});
}
this.DirectoryCopy(this._path, folder);
//2.解压升级程序到当前文件夹
this.Update(() =>
{
this.log.Text += "开始解压新文件";
this.log.Text += Environment.NewLine;
});
this.UnZip(installZipFile);
//3.成功删除备份和升级文件
Process.Start(this._file);
Application.Exit();
//4.失败还原备份
//File.Delete(file);
}
}
catch (Exception ex)
{
this.Update(() =>
{
this.log.Text += ex.Message;
this.log.Text += Environment.NewLine;
this.log.Text += ex.StackTrace;
this.log.Text += Environment.NewLine;
});
}
}
private void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs = true)
{
if (sourceDirName == Path.Combine(this._path, "backup"))
{
return;
}
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("Source directory does not exist or could not be found: " + sourceDirName);
}
DirectoryInfo[] dirs = dir.GetDirectories();
// If the destination directory doesn't exist, create it.
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
}
// Get the files in the directory and copy them to the new location.
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
string temppath = Path.Combine(destDirName, file.Name);
if (file.Name == "application.zip")
{
continue;
}
this.Update(() =>
{
this.log.Text += temppath + "开始备份";
this.log.Text += Environment.NewLine;
});
file.CopyTo(temppath, true);
this.Update(() =>
{
this.log.Text += temppath + "备份完成";
this.log.Text += Environment.NewLine;
});
}
// If copying subdirectories, copy them and their contents to new location.
if (copySubDirs)
{
foreach (DirectoryInfo subdir in dirs)
{
string temppath = Path.Combine(destDirName, subdir.Name);
DirectoryCopy(subdir.FullName, temppath, copySubDirs);
}
}
}
private void UnZip(string file)
{
using (var s = new ZipInputStream(File.OpenRead(file)))
{
ZipEntry theEntry = null;
while ((theEntry = s.GetNextEntry()) != null)
{
var directoryName = Path.GetDirectoryName(theEntry.Name);
var fileName = Path.GetFileName(theEntry.Name);
if (directoryName.Length > 0)
{
Directory.CreateDirectory(directoryName);
}
if (fileName != String.Empty)
{
var entryName = theEntry.Name;
if (entryName == "ICSharpCode.SharpZipLib.dll")
{
continue;
}
this.Update(() =>
{
this.log.Text += entryName + "开始解压";
this.log.Text += Environment.NewLine;
});
using (FileStream streamWriter = File.Create(entryName))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
this.Update(() =>
{
this.log.Text += entryName + "解压完成";
this.log.Text += Environment.NewLine;
});
}
}
}
}
private void Update(Action function)
{
this.Invoke(function);
}
}
}