RaUI/Source/ryUpdate/UpdateEdit/Backup/rycUpdate/frmmain.cs

253 lines
11 KiB
C#
Raw Normal View History

2020-11-28 07:03:28 +00:00
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(); }
}
}
}