using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace MV485.Upgrade
{
///
/// WndUpdateAsk.xaml 的交互逻辑
///
public partial class WndUpdateAsk : Window
{
private UpgradeModel UpgradeModel;
private WebClient downWebClient = new WebClient();
public WndUpdateAsk(UpgradeModel upgradeModel)
{
InitializeComponent();
UpgradeModel = upgradeModel;
txtNewVersion.Text = $"发现新版本 V{upgradeModel.VersionCode}";
txtInfo.Text = upgradeModel.Updates;
}
private void Border_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
DragMove();
}
}
private void BtnIgnore_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void BtnUpdate_Click(object sender, RoutedEventArgs e)
{
// 设置下载进度事件
downWebClient.DownloadProgressChanged += DownWebClient_DownloadProgressChanged;
downWebClient.DownloadFileCompleted += DownWebClient_DownloadFileCompleted;
string srcdownFile = Path.Combine(UpgradeHelper.UpgradeUrl, UpgradeModel.ApkName);
string localFileFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "upgrade");
// 确保文件夹存在
if (!Directory.Exists(localFileFolderPath))
{
Directory.CreateDirectory(localFileFolderPath);
}
string desdownFile = Path.Combine(localFileFolderPath, UpgradeModel.ApkName);
try
{
pnlUpdate.Visibility = Visibility.Collapsed;
pnlProgress.Visibility = Visibility.Visible;
downWebClient.DownloadFileAsync(new Uri(srcdownFile), desdownFile, desdownFile);
}
catch (WebException ex)
{
MessageBox.Show(ex.Message);
pnlUpdate.Visibility = Visibility.Visible;
pnlProgress.Visibility = Visibility.Collapsed;
}
catch (Exception ex)
{
MessageBox.Show($"发生意外错误: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
pnlUpdate.Visibility = Visibility.Visible;
pnlProgress.Visibility = Visibility.Collapsed;
}
}
private void DownWebClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
downWebClient.Dispose(); // 清理资源
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
pnlUpdate.Visibility = Visibility.Visible;
pnlProgress.Visibility = Visibility.Collapsed;
return;
}
try
{
string desDownFile = e.UserState.ToString();
string zipPath = System.IO.Path.GetDirectoryName(desDownFile);
//string zipPath = AppDomain.CurrentDomain.BaseDirectory;
ICSharpCode.SharpZipLib.ZipHelper.UnZip(desDownFile, zipPath, "", true);
string downPath = Path.GetDirectoryName(desDownFile);
File.Delete(desDownFile);
MessageBox.Show("升级完成,将自动重新启动程序。", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
RestartApp(zipPath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//move mydown_ty.exe c:\my.exe
}
private void DownWebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// 使用 Dispatcher 来确保在主线程中更新 UI
Dispatcher.BeginInvoke(new Action(() =>
{
downProgress.Value = e.ProgressPercentage;
txtProgress.Text = $"已下载 {e.ProgressPercentage}%";
}));
}
//移动下载好的文件并启动exe
private static void RestartApp(string zipPath)
{
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
StringBuilder sb = new StringBuilder();
sb.Append(@" /C ping 1.1.1.1 -n 1 -w 1000 > Nul");
sb.Append($" & MOVE {zipPath}\\* {baseDirectory}");
sb.Append($" & rd /s /q {zipPath}");
string sPf = Path.GetPathRoot(baseDirectory).Substring(0, 2);
sb.Append($" & {sPf}");
sb.Append($" & cd {baseDirectory}");
sb.Append($" & {Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName)}");
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", sb.ToString())
{
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = false
};
Process.Start(psi);
Application.Current.Shutdown();
}
///
/// 在命令行窗口中执行
///
///
///
static void CmdStartCTIProc(string sExePath, string sArguments)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
//p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
//ProcessWindowStyle.Minimized;
//| ProcessWindowStyle.Hidden;
//System.Diagnostics.ProcessWindowStyle.Hidden;
//p.Start();
//p.StandardInput.WriteLine(sExePath + " " + sArguments);
string sPf = Path.GetPathRoot(sExePath);
sPf = sPf.Substring(0, 2);
p.StandardInput.WriteLine(sPf);
string sMl = Path.GetDirectoryName(sExePath);
p.StandardInput.WriteLine("cd " + sMl);
//p.StandardInput.WriteLine(Path.get)
//p.StandardInput.WriteLine(sExePath);
p.StandardInput.WriteLine(Path.GetFileName(sExePath));
p.StandardInput.WriteLine("exit");
p.Close();
System.Threading.Thread.Sleep(5000);//必须等待,否则重启的程序还未启动完成;根据情况调整等待时间
}
///
/// 转换字节大小
///
/// 输入字节数
/// 返回值
private static string ConvertSize(long byteSize)
{
string str = "";
float tempf = (float)byteSize;
if (tempf / 1024 > 1)
{
if ((tempf / 1024) / 1024 > 1)
{
str = ((tempf / 1024) / 1024).ToString("##0.00", CultureInfo.InvariantCulture) + "MB";
}
else
{
str = (tempf / 1024).ToString("##0.00", CultureInfo.InvariantCulture) + "KB";
}
}
else
{
str = tempf.ToString(CultureInfo.InvariantCulture) + "B";
}
return str;
}
private void BtnClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
//------------------------------------------------
////////////////////////////////////////////////////////////////
}
}