Refactor Utils

This commit is contained in:
2dust
2024-10-14 10:42:05 +08:00
parent 4eb443e547
commit 6b99b7eec5
19 changed files with 160 additions and 265 deletions
+104 -221
View File
@@ -2,7 +2,6 @@
using CliWrap.Buffered;
using System.Collections.Specialized;
using System.Diagnostics;
using System.IO.Compression;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
@@ -11,13 +10,12 @@ using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Security.Principal;
using System.Text;
using System.Text.RegularExpressions;
namespace ServiceLib.Common
{
public class Utils
{
#region 资源Json操作
#region 资源操作
/// <summary>
/// 获取嵌入文本资源
@@ -26,12 +24,12 @@ namespace ServiceLib.Common
/// <returns></returns>
public static string GetEmbedText(string res)
{
string result = string.Empty;
var result = string.Empty;
try
{
Assembly assembly = Assembly.GetExecutingAssembly();
using Stream? stream = assembly.GetManifestResourceStream(res);
var assembly = Assembly.GetExecutingAssembly();
using var stream = assembly.GetManifestResourceStream(res);
ArgumentNullException.ThrowIfNull(stream);
using StreamReader reader = new(stream);
result = reader.ReadToEnd();
@@ -51,11 +49,10 @@ namespace ServiceLib.Common
{
try
{
if (!File.Exists(res))
if (File.Exists(res))
{
return null;
return File.ReadAllText(res);
}
return File.ReadAllText(res);
}
catch (Exception ex)
{
@@ -64,14 +61,15 @@ namespace ServiceLib.Common
return null;
}
#endregion 资源Json操作
#endregion 资源操作
#region 转换函数
/// <summary>
/// List<string>转逗号分隔的字符串
/// 转逗号分隔的字符串
/// </summary>
/// <param name="lst"></param>
/// <param name="wrap"></param>
/// <returns></returns>
public static string List2String(List<string>? lst, bool wrap = false)
{
@@ -93,35 +91,40 @@ namespace ServiceLib.Common
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
return string.Empty;
}
return string.Empty;
}
/// <summary>
/// 逗号分隔的字符串,转List<string>
/// 逗号分隔的字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static List<string> String2List(string str)
public static List<string>? String2List(string? str)
{
try
{
if (str == null)
{
return null;
}
str = str.Replace(Environment.NewLine, "");
return new List<string>(str.Split(',', StringSplitOptions.RemoveEmptyEntries));
}
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
return [];
}
return null;
}
/// <summary>
/// 逗号分隔的字符串,先排序后转List<string>
/// 逗号分隔的字符串,先排序后转List
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static List<string> String2ListSorted(string str)
public static List<string>? String2ListSorted(string str)
{
try
{
@@ -133,8 +136,8 @@ namespace ServiceLib.Common
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
return [];
}
return null;
}
/// <summary>
@@ -146,14 +149,14 @@ namespace ServiceLib.Common
{
try
{
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
return Convert.ToBase64String(plainTextBytes);
}
catch (Exception ex)
{
Logging.SaveLog("Base64Encode", ex);
return string.Empty;
}
return string.Empty;
}
/// <summary>
@@ -179,30 +182,24 @@ namespace ServiceLib.Common
plainText = plainText.PadRight(plainText.Length + 4 - plainText.Length % 4, '=');
}
byte[] data = Convert.FromBase64String(plainText);
var data = Convert.FromBase64String(plainText);
return Encoding.UTF8.GetString(data);
}
catch (Exception ex)
{
Logging.SaveLog("Base64Decode", ex);
return string.Empty;
}
return string.Empty;
}
/// <summary>
/// 转Int
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static int ToInt(object? obj)
{
try
{
return Convert.ToInt32(obj ?? string.Empty);
}
catch //(Exception ex)
catch
{
//SaveLog(ex.Message, ex);
return 0;
}
}
@@ -213,50 +210,47 @@ namespace ServiceLib.Common
{
return Convert.ToBoolean(obj);
}
catch //(Exception ex)
catch
{
//SaveLog(ex.Message, ex);
return false;
}
}
public static string ToString(object obj)
public static string ToString(object? obj)
{
try
{
return obj?.ToString() ?? string.Empty;
}
catch// (Exception ex)
catch
{
//SaveLog(ex.Message, ex);
return string.Empty;
}
}
/// <summary>
/// byte 转成 有两位小数点的 方便阅读的数据
/// 比如 2.50 MB
/// byte 转成 有两位小数点的 方便阅读的数据 比如 2.50 MB
/// </summary>
/// <param name="amount">bytes</param>
/// <param name="result">转换之后的数据</param>
/// <param name="unit">单位</param>
public static void ToHumanReadable(long amount, out double result, out string unit)
private static void ToHumanReadable(long amount, out double result, out string unit)
{
uint factor = 1024u;
var factor = 1024u;
//long KBs = amount / factor;
long KBs = amount;
var KBs = amount;
if (KBs > 0)
{
// multi KB
long MBs = KBs / factor;
var MBs = KBs / factor;
if (MBs > 0)
{
// multi MB
long GBs = MBs / factor;
var GBs = MBs / factor;
if (GBs > 0)
{
// multi GB
long TBs = GBs / factor;
var TBs = GBs / factor;
if (TBs > 0)
{
result = TBs + ((GBs % factor) / (factor + 0.0));
@@ -284,20 +278,18 @@ namespace ServiceLib.Common
public static string HumanFy(long amount)
{
ToHumanReadable(amount, out double result, out string unit);
return $"{string.Format("{0:f1}", result)} {unit}";
ToHumanReadable(amount, out var result, out var unit);
return $"{result:f1} {unit}";
}
public static string UrlEncode(string url)
{
return Uri.EscapeDataString(url);
//return HttpUtility.UrlEncode(url);
}
public static string UrlDecode(string url)
{
return Uri.UnescapeDataString(url);
//return HttpUtility.UrlDecode(url);
}
public static NameValueCollection ParseQueryString(string query)
@@ -308,10 +300,10 @@ namespace ServiceLib.Common
return result;
}
var parts = query[1..].Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
var parts = query[1..].Split('&', StringSplitOptions.RemoveEmptyEntries);
foreach (var part in parts)
{
var keyValue = part.Split(['=']);
var keyValue = part.Split('=');
if (keyValue.Length != 2)
{
continue;
@@ -328,12 +320,12 @@ namespace ServiceLib.Common
return result;
}
public static string GetMD5(string str)
public static string GetMd5(string str)
{
byte[] byteOld = Encoding.UTF8.GetBytes(str);
byte[] byteNew = MD5.HashData(byteOld);
var byteOld = Encoding.UTF8.GetBytes(str);
var byteNew = MD5.HashData(byteOld);
StringBuilder sb = new(32);
foreach (byte b in byteNew)
foreach (var b in byteNew)
{
sb.Append(b.ToString("x2"));
}
@@ -373,12 +365,12 @@ namespace ServiceLib.Common
{
if (plainText.IsNullOrEmpty()) return false;
var buffer = new Span<byte>(new byte[plainText.Length]);
return Convert.TryFromBase64String(plainText, buffer, out int _);
return Convert.TryFromBase64String(plainText, buffer, out var _);
}
public static string Convert2Comma(string text)
{
if (Utils.IsNullOrEmpty(text))
if (IsNullOrEmpty(text))
{
return text;
}
@@ -396,16 +388,7 @@ namespace ServiceLib.Common
/// <returns></returns>
public static bool IsNumeric(string oText)
{
try
{
int var1 = ToInt(oText);
return true;
}
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
return false;
}
return oText.All(char.IsNumber);
}
public static bool IsNullOrEmpty(string? text)
@@ -414,11 +397,7 @@ namespace ServiceLib.Common
{
return true;
}
if (text == "null")
{
return true;
}
return false;
return text == "null";
}
public static bool IsNotEmpty(string? text)
@@ -426,41 +405,6 @@ namespace ServiceLib.Common
return !string.IsNullOrEmpty(text);
}
/// <summary>
/// 验证IP地址是否合法
/// </summary>
/// <param name="ip"></param>
public static bool IsIP(string ip)
{
//如果为空
if (IsNullOrEmpty(ip))
{
return false;
}
//清除要验证字符串中的空格
//ip = ip.TrimEx();
//可能是CIDR
if (ip.IndexOf(@"/") > 0)
{
string[] cidr = ip.Split('/');
if (cidr.Length == 2)
{
if (!IsNumeric(cidr[0]))
{
return false;
}
ip = cidr[0];
}
}
//模式字符串
string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
//验证
return IsMatch(ip, pattern);
}
/// <summary>
/// 验证Domain地址是否合法
/// </summary>
@@ -476,19 +420,9 @@ namespace ServiceLib.Common
return Uri.CheckHostName(domain) == UriHostNameType.Dns;
}
/// <summary>
/// 验证输入字符串是否与模式字符串匹配,匹配返回true
/// </summary>
/// <param name="input">输入字符串</param>
/// <param name="pattern">模式字符串</param>
public static bool IsMatch(string input, string pattern)
{
return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase);
}
public static bool IsIpv6(string ip)
{
if (IPAddress.TryParse(ip, out IPAddress? address))
if (IPAddress.TryParse(ip, out var address))
{
return address.AddressFamily switch
{
@@ -504,43 +438,20 @@ namespace ServiceLib.Common
#region 测速
public static void SetSecurityProtocol(bool enableSecurityProtocolTls13)
private static bool PortInUse(int port)
{
if (enableSecurityProtocolTls13)
{
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
}
else
{
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
}
ServicePointManager.DefaultConnectionLimit = 256;
}
public static bool PortInUse(int port)
{
bool inUse = false;
try
{
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners();
var lstIpEndPoints = new List<IPEndPoint>(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners());
foreach (IPEndPoint endPoint in ipEndPoints)
{
if (endPoint.Port == port)
{
inUse = true;
break;
}
}
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
var ipEndPoints = ipProperties.GetActiveTcpListeners();
//var lstIpEndPoints = new List<IPEndPoint>(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners());
return ipEndPoints.Any(endPoint => endPoint.Port == port);
}
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
}
return inUse;
return false;
}
public static int GetFreePort(int defaultPort = 9090)
@@ -554,7 +465,7 @@ namespace ServiceLib.Common
TcpListener l = new(IPAddress.Loopback, 0);
l.Start();
int port = ((IPEndPoint)l.LocalEndpoint).Port;
var port = ((IPEndPoint)l.LocalEndpoint).Port;
l.Stop();
return port;
}
@@ -578,23 +489,18 @@ namespace ServiceLib.Common
{
if (blFull)
{
return string.Format("{0} - V{1} - {2}",
Global.AppName,
GetVersionInfo(),
File.GetLastWriteTime(GetExePath()).ToString("yyyy/MM/dd"));
return $"{Global.AppName} - V{GetVersionInfo()} - {File.GetLastWriteTime(GetExePath()):yyyy/MM/dd}";
}
else
{
return string.Format("{0}/{1}",
Global.AppName,
GetVersionInfo());
return $"{Global.AppName}/{GetVersionInfo()}";
}
}
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
return Global.AppName;
}
return Global.AppName;
}
public static string GetVersionInfo()
@@ -614,7 +520,7 @@ namespace ServiceLib.Common
/// 取得GUID
/// </summary>
/// <returns></returns>
public static string GetGUID(bool full = true)
public static string GetGuid(bool full = true)
{
try
{
@@ -634,14 +540,6 @@ namespace ServiceLib.Common
return string.Empty;
}
public static string GetDownloadFileName(string url)
{
var fileName = Path.GetFileName(url);
fileName += "_temp";
return fileName;
}
public static bool IsGuidByParse(string strSrc)
{
return Guid.TryParse(strSrc, out _);
@@ -667,12 +565,12 @@ namespace ServiceLib.Common
public static Dictionary<string, string> GetSystemHosts()
{
var systemHosts = new Dictionary<string, string>();
var hostfile = @"C:\Windows\System32\drivers\etc\hosts";
var hostFile = @"C:\Windows\System32\drivers\etc\hosts";
try
{
if (File.Exists(hostfile))
if (File.Exists(hostFile))
{
var hosts = File.ReadAllText(hostfile).Replace("\r", "");
var hosts = File.ReadAllText(hostFile).Replace("\r", "");
var hostsList = hosts.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var host in hostsList)
@@ -693,10 +591,10 @@ namespace ServiceLib.Common
public static async Task<string?> GetCliWrapOutput(string filePath, string? arg)
{
return await GetCliWrapOutput(filePath, arg != null ? [arg] : null);
return await GetCliWrapOutput(filePath, arg != null ? new List<string>() { arg } : null);
}
public static async Task<string?> GetCliWrapOutput(string filePath, IEnumerable<string>? args)
private static async Task<string?> GetCliWrapOutput(string filePath, IEnumerable<string>? args)
{
try
{
@@ -736,7 +634,7 @@ namespace ServiceLib.Common
/// <returns></returns>
public static string GetPath(string fileName)
{
string startupPath = StartupPath();
var startupPath = StartupPath();
if (IsNullOrEmpty(fileName))
{
return startupPath;
@@ -760,113 +658,104 @@ namespace ServiceLib.Common
public static string GetTempPath(string filename = "")
{
string _tempPath = Path.Combine(StartupPath(), "guiTemps");
if (!Directory.Exists(_tempPath))
var tempPath = Path.Combine(StartupPath(), "guiTemps");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
if (Utils.IsNullOrEmpty(filename))
if (IsNullOrEmpty(filename))
{
return _tempPath;
return tempPath;
}
else
{
return Path.Combine(_tempPath, filename);
return Path.Combine(tempPath, filename);
}
}
public static string UnGzip(byte[] buf)
{
using MemoryStream sb = new();
using GZipStream input = new(new MemoryStream(buf), CompressionMode.Decompress, false);
input.CopyTo(sb);
sb.Position = 0;
return new StreamReader(sb, Encoding.UTF8).ReadToEnd();
}
public static string GetBackupPath(string filename)
{
string _tempPath = Path.Combine(StartupPath(), "guiBackups");
if (!Directory.Exists(_tempPath))
var tempPath = Path.Combine(StartupPath(), "guiBackups");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
return Path.Combine(_tempPath, filename);
return Path.Combine(tempPath, filename);
}
public static string GetConfigPath(string filename = "")
{
string _tempPath = Path.Combine(StartupPath(), "guiConfigs");
if (!Directory.Exists(_tempPath))
var tempPath = Path.Combine(StartupPath(), "guiConfigs");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
if (Utils.IsNullOrEmpty(filename))
{
return _tempPath;
return tempPath;
}
else
{
return Path.Combine(_tempPath, filename);
return Path.Combine(tempPath, filename);
}
}
public static string GetBinPath(string filename, string? coreType = null)
{
string _tempPath = Path.Combine(StartupPath(), "bin");
if (!Directory.Exists(_tempPath))
var tempPath = Path.Combine(StartupPath(), "bin");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
if (coreType != null)
{
_tempPath = Path.Combine(_tempPath, coreType.ToString());
if (!Directory.Exists(_tempPath))
tempPath = Path.Combine(tempPath, coreType.ToString());
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
}
if (Utils.IsNullOrEmpty(filename))
if (IsNullOrEmpty(filename))
{
return _tempPath;
return tempPath;
}
else
{
return Path.Combine(_tempPath, filename);
return Path.Combine(tempPath, filename);
}
}
public static string GetLogPath(string filename = "")
{
string _tempPath = Path.Combine(StartupPath(), "guiLogs");
if (!Directory.Exists(_tempPath))
var tempPath = Path.Combine(StartupPath(), "guiLogs");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
if (Utils.IsNullOrEmpty(filename))
{
return _tempPath;
return tempPath;
}
else
{
return Path.Combine(_tempPath, filename);
return Path.Combine(tempPath, filename);
}
}
public static string GetFontsPath(string filename = "")
{
string _tempPath = Path.Combine(StartupPath(), "guiFonts");
if (!Directory.Exists(_tempPath))
var tempPath = Path.Combine(StartupPath(), "guiFonts");
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(_tempPath);
Directory.CreateDirectory(tempPath);
}
if (Utils.IsNullOrEmpty(filename))
{
return _tempPath;
return tempPath;
}
else
{
return Path.Combine(_tempPath, filename);
return Path.Combine(tempPath, filename);
}
}
@@ -882,14 +771,7 @@ namespace ServiceLib.Common
public static string GetExeName(string name)
{
if (IsWindows())
{
return $"{name}.exe";
}
else
{
return name;
}
return IsWindows() ? $"{name}.exe" : name;
}
public static bool IsAdministrator()
@@ -901,7 +783,7 @@ namespace ServiceLib.Common
else
{
var id = GetLinuxUserId().Result ?? "1000";
if (int.TryParse(id, out int userId))
if (int.TryParse(id, out var userId))
{
return userId == 0;
}
@@ -914,7 +796,8 @@ namespace ServiceLib.Common
private static async Task<string?> GetLinuxUserId()
{
return await GetCliWrapOutput("/bin/bash", ["-c", "id -u"]);
var arg = new List<string>() { "-c", "id -u" };
return await GetCliWrapOutput("/bin/bash", arg);
}
#endregion Platform