253 lines
11 KiB
C#
253 lines
11 KiB
C#
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(); }
|
||
}
|
||
|
||
|
||
}
|
||
}
|