If the update fails during the upgrade, the update will be retried.

This commit is contained in:
2dust 2025-03-01 14:23:43 +08:00
parent aa5e4378ab
commit 9748fbb076
3 changed files with 119 additions and 84 deletions

View file

@ -1,29 +1,39 @@
namespace AmazTool namespace AmazTool
{ {
internal static class Program internal static class Program
{ {
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread] [STAThread]
private static void Main(string[] args) private static void Main(string[] args)
{ {
if (args.Length == 0) if (args.Length == 0)
{ {
Console.WriteLine(Resx.Resource.Guidelines); Utils.WriteLine(Resx.Resource.Guidelines);
Thread.Sleep(5000); Utils.Waiting(5);
return; return;
} }
var argData = Uri.UnescapeDataString(string.Join(" ", args)); var argData = Uri.UnescapeDataString(string.Join(" ", args));
if (argData.Equals("rebootas")) if (argData.Equals("rebootas"))
{ {
Thread.Sleep(1000); Utils.Waiting(1);
Utils.StartV2RayN(); Utils.StartV2RayN();
return; return;
} }
var tryTimes = 0;
UpgradeApp.Init();
while (tryTimes++ < 3)
{
if (!UpgradeApp.Upgrade(argData))
{
continue;
}
UpgradeApp.Upgrade(argData); Utils.WriteLine(Resx.Resource.Restartv2rayN);
Utils.Waiting(3);
Utils.StartV2RayN();
break;
}
} }
} }
} }

View file

@ -6,19 +6,99 @@ namespace AmazTool
{ {
internal class UpgradeApp internal class UpgradeApp
{ {
public static void Upgrade(string fileName) public static bool Upgrade(string fileName)
{ {
Console.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); Utils.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}");
Utils.Waiting(5);
if (!File.Exists(fileName)) if (!File.Exists(fileName))
{ {
Console.WriteLine(Resx.Resource.UpgradeFileNotFound); Utils.WriteLine(Resx.Resource.UpgradeFileNotFound);
return; return false;
} }
Console.WriteLine(Resx.Resource.TryTerminateProcess); Utils.Waiting(5);
KillV2rayN();
Utils.WriteLine(Resx.Resource.StartUnzipping);
StringBuilder sb = new();
try
{
var splitKey = "/";
using var archive = ZipFile.OpenRead(fileName);
foreach (var entry in archive.Entries)
{
try
{
if (entry.Length == 0)
{
continue;
}
Utils.WriteLine(entry.FullName);
var lst = entry.FullName.Split(splitKey);
if (lst.Length == 1)
{
continue;
}
var fullName = string.Join(splitKey, lst[1..lst.Length]);
var entryOutputPath = Utils.GetPath(fullName);
Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!);
//In the bin folder, if the file already exists, it will be skipped
if (fullName.StartsWith("bin") && File.Exists(entryOutputPath))
{
continue;
}
entry.ExtractToFile(entryOutputPath, true);
Utils.WriteLine(entryOutputPath);
}
catch (Exception ex)
{
sb.Append(ex.Message);
sb.Append(ex.StackTrace);
}
}
}
catch (Exception ex)
{
sb.Append(Resx.Resource.FailedUpgrade + ex.StackTrace);
}
if (sb.Length <= 0)
{
return true;
}
Utils.WriteLine(sb.ToString());
Utils.WriteLine(Resx.Resource.FailedUpgrade);
return false;
}
public static bool Init()
{
//Process temporary files generated by the last update
var files = Directory.GetFiles(Utils.GetPath(""), "*.tmp");
foreach (var file in files)
{
if (file.Contains(Utils.AmazTool))
{
File.Delete(file);
}
}
var destFileName = $"{Utils.GetExePath()}{Guid.NewGuid().ToString("N")[..8]}.tmp";
File.Move(Utils.GetExePath(), destFileName);
return true;
}
private static bool KillV2rayN()
{
Utils.WriteLine(Resx.Resource.TryTerminateProcess);
try try
{ {
var existing = Process.GetProcessesByName(Utils.V2rayN); var existing = Process.GetProcessesByName(Utils.V2rayN);
@ -35,71 +115,10 @@ namespace AmazTool
catch (Exception ex) catch (Exception ex)
{ {
// Access may be denied without admin right. The user may not be an administrator. // Access may be denied without admin right. The user may not be an administrator.
Console.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); Utils.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace);
} }
Console.WriteLine(Resx.Resource.StartUnzipping); return true;
StringBuilder sb = new();
try
{
var thisAppOldFile = $"{Utils.GetExePath()}.tmp";
File.Delete(thisAppOldFile);
var splitKey = "/";
using var archive = ZipFile.OpenRead(fileName);
foreach (var entry in archive.Entries)
{
try
{
if (entry.Length == 0)
{
continue;
}
Console.WriteLine(entry.FullName);
var lst = entry.FullName.Split(splitKey);
if (lst.Length == 1)
continue;
var fullName = string.Join(splitKey, lst[1..lst.Length]);
if (string.Equals(Utils.GetExePath(), Utils.GetPath(fullName), StringComparison.OrdinalIgnoreCase))
{
File.Move(Utils.GetExePath(), thisAppOldFile);
}
var entryOutputPath = Utils.GetPath(fullName);
Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!);
//In the bin folder, if the file already exists, it will be skipped
if (fullName.StartsWith("bin") && File.Exists(entryOutputPath))
{
continue;
}
entry.ExtractToFile(entryOutputPath, true);
Console.WriteLine(entryOutputPath);
}
catch (Exception ex)
{
sb.Append(ex.StackTrace);
}
}
}
catch (Exception ex)
{
Console.WriteLine(Resx.Resource.FailedUpgrade + ex.StackTrace);
//return;
}
if (sb.Length > 0)
{
Console.WriteLine(Resx.Resource.FailedUpgrade + sb.ToString());
//return;
}
Console.WriteLine(Resx.Resource.Restartv2rayN);
Utils.Waiting(2);
Utils.StartV2RayN();
} }
} }
} }

View file

@ -1,4 +1,4 @@
using System.Diagnostics; using System.Diagnostics;
namespace AmazTool namespace AmazTool
{ {
@ -14,9 +14,9 @@ namespace AmazTool
return AppDomain.CurrentDomain.BaseDirectory; return AppDomain.CurrentDomain.BaseDirectory;
} }
public static string GetPath(string fileName) public static string GetPath(string? fileName)
{ {
string startupPath = StartupPath(); var startupPath = StartupPath();
if (string.IsNullOrEmpty(fileName)) if (string.IsNullOrEmpty(fileName))
{ {
return startupPath; return startupPath;
@ -25,6 +25,7 @@ namespace AmazTool
} }
public static string V2rayN => "v2rayN"; public static string V2rayN => "v2rayN";
public static string AmazTool => "AmazTool";
public static void StartV2RayN() public static void StartV2RayN()
{ {
@ -44,9 +45,14 @@ namespace AmazTool
{ {
for (var i = second; i > 0; i--) for (var i = second; i > 0; i--)
{ {
Console.WriteLine(i); Utils.WriteLine(i);
Thread.Sleep(1000); Thread.Sleep(1000);
} }
} }
public static void WriteLine(object obj)
{
Console.WriteLine(obj);
}
} }
} }