Skip to content

Commit

Permalink
Refactor Upgrade
Browse files Browse the repository at this point in the history
  • Loading branch information
2dust committed Oct 8, 2024
1 parent 53e19ec commit b266910
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 147 deletions.
153 changes: 6 additions & 147 deletions v2rayN/v2rayUpgrade/Program.cs
Original file line number Diff line number Diff line change
@@ -1,163 +1,22 @@
using System.Diagnostics;
using System.IO.Compression;
using System.Runtime.InteropServices;
using System.Text;

namespace v2rayUpgrade
namespace v2rayUpgrade
{
internal static class Program
{
private static readonly string defaultFilename = "v2rayN.zip_temp";
private static string? fileName;

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
private static void Main(string[] args)
{
if (args.Length > 0)
{
fileName = Uri.UnescapeDataString(string.Join(" ", args));
}
else
{
fileName = defaultFilename;
}
Console.WriteLine(fileName);
Console.WriteLine("In progress, please wait...(正在进行中,请等待)");

Thread.Sleep(5000);

try
{
Process[] existing = Process.GetProcessesByName(V2rayN());
foreach (Process p in existing)
{
var path = p.MainModule?.FileName ?? "";
if (path.StartsWith(GetPath(V2rayN())))
{
p.Kill();
p.WaitForExit(100);
}
}
}
catch (Exception ex)
{
// Access may be denied without admin right. The user may not be an administrator.
Console.WriteLine("Failed to close v2rayN(关闭v2rayN失败).\n" +
"Close it manually, or the upgrade may fail.(请手动关闭正在运行的v2rayN,否则可能升级失败。\n\n" + ex.StackTrace);
}

if (!File.Exists(fileName))
{
if (File.Exists(defaultFilename))
{
fileName = defaultFilename;
}
else
{
Console.WriteLine("Upgrade Failed, File Not Exist(升级失败,文件不存在).");
return;
}
}

StringBuilder sb = new();
try
{
string thisAppOldFile = $"{GetExePath()}.tmp";
File.Delete(thisAppOldFile);
string splitKey = "/";

using ZipArchive archive = ZipFile.OpenRead(fileName);
foreach (ZipArchiveEntry entry in archive.Entries)
{
try
{
if (entry.Length == 0)
{
continue;
}

var lst = entry.FullName.Split(splitKey);
if (lst.Length == 1) continue;
string fullName = string.Join(splitKey, lst[1..lst.Length]);

if (string.Equals(GetExePath(), GetPath(fullName), StringComparison.OrdinalIgnoreCase))
{
File.Move(GetExePath(), thisAppOldFile);
}

string entryOutputPath = GetPath(fullName);
Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!);
entry.ExtractToFile(entryOutputPath, true);

Console.WriteLine(entryOutputPath);
}
catch (Exception ex)
{
sb.Append(ex.StackTrace);
}
}
}
catch (Exception ex)
if (args.Length == 0)
{
Console.WriteLine("Upgrade Failed(升级失败)." + ex.StackTrace);
Console.WriteLine("Please run it from the main application.(请从主应用运行)");
Thread.Sleep(5000);
return;
}
if (sb.Length > 0)
{
Console.WriteLine("Upgrade Failed.\n" +
"(升级失败)." + sb.ToString());
return;
}

Console.WriteLine("Start v2rayN, please wait...(正在重启,请等待)");
Thread.Sleep(3000);
Process process = new()
{
StartInfo = new()
{
FileName = V2rayN(),
WorkingDirectory = StartupPath()
}
};
process.Start();
}

public static string GetExePath()
{
return Environment.ProcessPath ?? string.Empty;
}

public static string StartupPath()
{
return AppDomain.CurrentDomain.BaseDirectory;
}

public static string GetPath(string fileName)
{
string startupPath = StartupPath();
if (string.IsNullOrEmpty(fileName))
{
return startupPath;
}
return Path.Combine(startupPath, fileName);
}

private static string V2rayN()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
if (File.Exists(GetPath("v2rayN.exe")))
return "v2rayN";
else
return "v2rayN.Desktop";
}
else
{
return "v2rayN.Desktop";
}
var fileName = Uri.UnescapeDataString(string.Join(" ", args));
Upgrade.UpgradeApp(fileName);
}
}
}
141 changes: 141 additions & 0 deletions v2rayN/v2rayUpgrade/Upgrade.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
using System.Diagnostics;
using System.IO.Compression;
using System.Runtime.InteropServices;
using System.Text;

namespace v2rayUpgrade
{
internal class Upgrade
{
public static void UpgradeApp(string fileName)
{
Console.WriteLine(fileName);
Console.WriteLine("In progress, please wait...(正在进行中,请等待)");

Thread.Sleep(5000);

if (!File.Exists(fileName))
{
Console.WriteLine("Upgrade Failed, File Not Exist(升级失败,文件不存在).");
return;
}

try
{
Process[] existing = Process.GetProcessesByName(V2rayN());
foreach (Process p in existing)
{
var path = p.MainModule?.FileName ?? "";
if (path.StartsWith(GetPath(V2rayN())))
{
p.Kill();
p.WaitForExit(100);
}
}
}
catch (Exception ex)
{
// Access may be denied without admin right. The user may not be an administrator.
Console.WriteLine("Failed to close v2rayN(关闭v2rayN失败).\n" +
"Close it manually, or the upgrade may fail.(请手动关闭正在运行的v2rayN,否则可能升级失败。\n\n" + ex.StackTrace);
}

StringBuilder sb = new();
try
{
string thisAppOldFile = $"{GetExePath()}.tmp";
File.Delete(thisAppOldFile);
string splitKey = "/";

using ZipArchive archive = ZipFile.OpenRead(fileName);
foreach (ZipArchiveEntry entry in archive.Entries)
{
try
{
if (entry.Length == 0)
{
continue;
}

var lst = entry.FullName.Split(splitKey);
if (lst.Length == 1) continue;
string fullName = string.Join(splitKey, lst[1..lst.Length]);

if (string.Equals(GetExePath(), GetPath(fullName), StringComparison.OrdinalIgnoreCase))
{
File.Move(GetExePath(), thisAppOldFile);
}

string entryOutputPath = GetPath(fullName);
Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!);
entry.ExtractToFile(entryOutputPath, true);

Console.WriteLine(entryOutputPath);
}
catch (Exception ex)
{
sb.Append(ex.StackTrace);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Upgrade Failed(升级失败)." + ex.StackTrace);
return;
}
if (sb.Length > 0)
{
Console.WriteLine("Upgrade Failed.\n" +
"(升级失败)." + sb.ToString());
return;
}

Console.WriteLine("Start v2rayN, please wait...(正在重启,请等待)");
Thread.Sleep(3000);
Process process = new()
{
StartInfo = new()
{
FileName = V2rayN(),
WorkingDirectory = StartupPath()
}
};
process.Start();
}

private static string GetExePath()
{
return Environment.ProcessPath ?? string.Empty;
}

private static string StartupPath()
{
return AppDomain.CurrentDomain.BaseDirectory;
}

private static string GetPath(string fileName)
{
string startupPath = StartupPath();
if (string.IsNullOrEmpty(fileName))
{
return startupPath;
}
return Path.Combine(startupPath, fileName);
}

private static string V2rayN()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
if (File.Exists(GetPath("v2rayN.exe")))
return "v2rayN";
else
return "v2rayN.Desktop";
}
else
{
return "v2rayN.Desktop";
}
}
}
}

0 comments on commit b266910

Please sign in to comment.