RaUI/Source/ryUpdate/UpdateEdit/rycUpdate/frmmain.cs
2020-11-28 15:03:57 +08:00

253 lines
11 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 System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Threading;
namespace rycUpdate
{
public partial class frmmain : Form
{
#region
[DllImport("shell32.dll")]
private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);
///
/// 执行删除。成功返回空,否则返回错误信息。
///
///
///
public static int FilesDelete(string path)
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();
lpFileOp.wFunc = wFunc.FO_DELETE;
lpFileOp.pFrom = path + "\0";
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOCONFIRMATION | FILEOP_FLAGS.FOF_NOERRORUI | FILEOP_FLAGS.FOF_SILENT;
lpFileOp.fFlags &= ~FILEOP_FLAGS.FOF_ALLOWUNDO;
lpFileOp.fAnyOperationsAborted = false;
int n = SHFileOperation(ref lpFileOp);
if (n != 0) return 1;
return 0;
//string tmp = GetErrorString(n);
//.av 文件正常删除了但也提示 402 错误,不知道为什么。屏蔽之。
//if ((path.ToLower().EndsWith(".av") && n.ToString("X") == "402")) return string.Empty;
}
private struct SHFILEOPSTRUCT
{
public IntPtr hwnd;
public wFunc wFunc;
public string pFrom;
public string pTo;
public FILEOP_FLAGS fFlags;
public bool fAnyOperationsAborted;
public IntPtr hNameMappings;
public string lpszProgressTitle;
}
private enum wFunc
{
FO_MOVE = 0x0001,
FO_COPY = 0x0002,
FO_DELETE = 0x0003,
FO_RENAME = 0x0004
}
private enum FILEOP_FLAGS
{
FOF_MULTIDESTFILES = 0x0001, //pTo 指定了多个目标文件,而不是单个目录
FOF_CONFIRMMOUSE = 0x0002,
FOF_SILENT = 0x0044, // 不显示一个进度对话框
FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵触的名字时,自动分配前缀
FOF_NOCONFIRMATION = 0x10, // 不对用户显示提示
FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放
FOF_ALLOWUNDO = 0x40, // 允许撤销
FOF_FILESONLY = 0x0080, // 使用 *.* 时, 只对文件操作
FOF_SIMPLEPROGRESS = 0x0100, // 简单进度条,意味者不显示文件名。
FOF_NOCONFIRMMKDIR = 0x0200, // 建新目录时不需要用户确定
FOF_NOERRORUI = 0x0400, // 不显示出错用户界面
FOF_NOCOPYSECURITYATTRIBS = 0x0800, // 不复制 NT 文件的安全属性
FOF_NORECURSION = 0x1000 // 不递归目录
}
#endregion
string commandStr = "";
public frmmain()
{
InitializeComponent();
}
public frmmain(string[] args)
{
commandStr = args[0];
InitializeComponent();
}
private void frmmain_Load(object sender, EventArgs e)
{
clsPram.myHandle = System.Diagnostics.Process.GetCurrentProcess().Handle.ToInt32();
timer1.Enabled = true;
}
public int RunFile(string FilePath, string PramCom)
{
try
{
System.Diagnostics.Process.Start(FilePath, PramCom);
return 1;
}
catch { return 0; }
}
public void CopyFiles(string varFromDirectory, string varToDirectory)
{//实现从一个目录下完整拷贝到另一个目录下。
//Directory.CreateDirectory(varToDirectory);
if (!Directory.Exists(varFromDirectory))
{
//m_eorrStr = "对不起,您要拷贝的目录不存在。 ";
return;
}
string[] directories = Directory.GetDirectories(varFromDirectory);//取文件夹下所有文件夹名,放入数组;
if (directories.Length > 0)
{
foreach (string d in directories)
{
try
{
CopyFiles(d, varToDirectory + d.Substring(d.LastIndexOf("\\ ")));//递归拷贝文件和文件夹
}
catch { }
}
}
string[] files = Directory.GetFiles(varFromDirectory);//取文件夹下所有文件名,放入数组;
if (files.Length > 0)
{
foreach (string s in files)
{
try
{
File.Copy(s, varToDirectory + s.Substring(s.LastIndexOf("\\ ")));
}
catch { }
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//try
{
timer1.Stop();
lblShow.Text = "正在校验升级文件。。。";
Application.DoEvents();
clsPram.UpdateZipPath = Application.StartupPath + "\\Update\\tmp.tmp";
clsPram.UnZipPath = Application.StartupPath + "\\Update\\tmp";
if (commandStr == "update") //如果是第一次调用,就是解压升级
{
#region
if (System.IO.File.Exists(clsPram.UpdateZipPath) == false) //如果升级文件不存在,那么就升级失败
{
MessageBox.Show("升级文件不存在,升级中断。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
if (System.IO.Directory.Exists(clsPram.UnZipPath)) //如果解压文件夹已经存在,那么就先删除
{
FilesDelete(clsPram.UnZipPath);
}
lblShow.Text = "正在解包升级文件。。。";
Application.DoEvents();
try
{
UnZipClass.UnZip(clsPram.UpdateZipPath, clsPram.UnZipPath, "");//解压到指定文件夹
}
catch
{
MessageBox.Show("升级包校验出错,升级中断。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
ryCommon.clsStorage tStor = new ryCommon.clsStorage();
tStor.LoadFromFile(Application.StartupPath + "\\tmp.updx");
tStor.SelectNode2("id", "KillProcList");
clsPram.KillMultiProcess(tStor.GetAttrValue("Value", ""));
lblShow.Text = "正在复制升级文件。。。";
Application.DoEvents();
Thread.Sleep(500);
Common.Files.FileOperator cf = new Common.Files.FileOperator();
cf.CopyDirectoryAndFiles(clsPram.UnZipPath, Application.StartupPath);
//如果升级包里面存在升级程序,则说明这是软件升级,否则表示数据库升级
if (System.IO.File.Exists(clsPram.UnZipPath + "\\" + clsPram.UpdateFileName))
{
try
{
FilesDelete(Application.StartupPath + "\\" + clsPram.newUpdateFileName);
//复制升级文件过来
File.Copy(clsPram.UnZipPath + "\\" + clsPram.UpdateFileName, Application.StartupPath + "\\" + clsPram.newUpdateFileName, true);
}
catch { }
RunFile(Application.StartupPath + "\\" + clsPram.newUpdateFileName, "replace");
}
else
{
tStor.SelectNode2("id", "MainProcName");
clsPram.MainName = tStor.GetAttrValue("Value", "");
RunFile(Application.StartupPath + "\\" + clsPram.MainName, "");
}
this.Close();
#endregion
}
else if (commandStr == "replace")//完成升级程序的替换
{
#region
lblShow.Text = "正在替换升级文件。。。";
Application.DoEvents();
clsPram.KillProcess(clsPram.UpdateFileName);//结束之前的升级进程
Thread.Sleep(700);
try
{
FilesDelete(Application.StartupPath + "\\" + clsPram.UpdateFileName);
//升级文件替换
File.Copy(Application.StartupPath + "\\" + clsPram.newUpdateFileName, Application.StartupPath + "\\" + clsPram.UpdateFileName,true);
}
catch { }
RunFile(Application.StartupPath + "\\" + clsPram.UpdateFileName, "del");
this.Close();
#endregion
}
else if (commandStr == "del")//做最后清理工作
{
#region
lblShow.Text = "正在删除升级残余文件。。。";
Application.DoEvents();
ryCommon.clsStorage tStor = new ryCommon.clsStorage();
tStor.LoadFromFile(Application.StartupPath + "\\tmp.updx");
tStor.SelectNode2("id", "MainProcName");
clsPram.MainName = tStor.GetAttrValue("Value", "");
Thread.Sleep(1000);
clsPram.KillProcess(clsPram.newUpdateFileName);//结束之前的升级进程
try
{
//删除旧的升级文件
FilesDelete(Application.StartupPath + "\\" + clsPram.newUpdateFileName);
FilesDelete(Application.StartupPath + "\\Update");
FilesDelete(Application.StartupPath + "\\tmp.updx");
}
catch { }
RunFile(Application.StartupPath + "\\" + clsPram.MainName, "");
this.Close();
#endregion
}
else
{
this.Close();
}
}
//catch { this.Close(); }
}
}
}