using Serilog; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace Wood.Util { public class ComputerHelper { public static ComputerInfo GetComputerInfo() { ComputerInfo computerInfo = new ComputerInfo(); try { MemoryMetricsClient client = new MemoryMetricsClient(); MemoryMetrics? memoryMetrics = client.GetMetrics(); if (memoryMetrics != null) { computerInfo.TotalRAM = Math.Ceiling(memoryMetrics.Total / 1024).ToString() + " GB"; computerInfo.RAMRate = Math.Ceiling(100 * memoryMetrics.Used / memoryMetrics.Total).ToString() + " %"; } computerInfo.CPURate = Math.Ceiling(GetCPURate().ToDouble()) + " %"; computerInfo.RunTime = GetRunTime(); } catch (Exception ex) { Log.Error(ex, "获取计算机信息失败!"); } return computerInfo; } public static bool IsUnix() { var isUnix = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux); return isUnix; } public static string GetCPURate() { string cpuRate = "0"; if (IsUnix()) { string output = ShellHelper.Bash("top -b -n1 | grep \"Cpu(s)\" | awk '{print $2 + $4}'"); cpuRate = output.Trim(); } else { string? output = ShellHelper.Cmd("wmic", "cpu get LoadPercentage"); cpuRate = output?.Replace("LoadPercentage", string.Empty).Trim()??"0"; } return cpuRate; } public static string GetRunTime() { string runTime = string.Empty; try { if (IsUnix()) { string output = ShellHelper.Bash("uptime -s"); output = output.Trim(); runTime = DateTimeHelper.FormatTime((DateTime.Now - output.ToDateTime())?.TotalMilliseconds.ToString().Split('.')[0].ToLong()??0); } else { string? output = ShellHelper.Cmd("wmic", "OS get LastBootUpTime/Value"); string[]? outputArr = output?.Split("=", StringSplitOptions.RemoveEmptyEntries); if (outputArr!=null&&outputArr.Length == 2) { runTime = DateTimeHelper.FormatTime((DateTime.Now - outputArr[1].Split('.')[0].ToDateTime())?.TotalMilliseconds.ToString().Split('.')[0].ToLong()??0); } } } catch (Exception ex) { Log.Error(ex, "获取计算机运行时间失败!"); } return runTime; } } public class MemoryMetrics { public double Total { get; set; } public double Used { get; set; } public double Free { get; set; } } public class MemoryMetricsClient { public MemoryMetrics? GetMetrics() { if (ComputerHelper.IsUnix()) { return GetUnixMetrics(); } return GetWindowsMetrics(); } private MemoryMetrics? GetWindowsMetrics() { string? output = ShellHelper.Cmd("wmic", "OS get FreePhysicalMemory,TotalVisibleMemorySize /Value"); var lines = output?.Trim().Split("\n"); if (lines != null) { var freeMemoryParts = lines[0].Split("=", StringSplitOptions.RemoveEmptyEntries); var totalMemoryParts = lines[1].Split("=", StringSplitOptions.RemoveEmptyEntries); var metrics = new MemoryMetrics(); metrics.Total = Math.Round(double.Parse(totalMemoryParts[1]) / 1024, 0); metrics.Free = Math.Round(double.Parse(freeMemoryParts[1]) / 1024, 0); metrics.Used = metrics.Total - metrics.Free; return metrics; } return null; } private MemoryMetrics GetUnixMetrics() { string output = ShellHelper.Bash("free -m"); var lines = output.Split("\n"); var memory = lines[1].Split(" ", StringSplitOptions.RemoveEmptyEntries); var metrics = new MemoryMetrics(); metrics.Total = double.Parse(memory[1]); metrics.Used = double.Parse(memory[2]); metrics.Free = double.Parse(memory[3]); return metrics; } } public class ComputerInfo { /// /// CPU使用率 /// public string? CPURate { get; set; } /// /// 总内存 /// public string? TotalRAM { get; set; } /// /// 内存使用率 /// public string? RAMRate { get; set; } /// /// 系统运行时间 /// public string? RunTime { get; set; } } }