2026-01-23 15:55:56 +01:00

61 lines
2.3 KiB
C#

using System.Management;
using System.Runtime.InteropServices;
namespace Lentia.Utils;
public class RamMetrics {
public double TotalGb { get; set; }
public double FreeGb { get; set; }
}
public static class Hardware {
public static RamMetrics GetRamUsage() {
var metrics = new RamMetrics();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
GetWindowsRam(metrics);
} else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) {
GetLinuxRam(metrics);
} else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) {
GetMacRam(metrics);
}
return metrics;
}
private static void GetWindowsRam(RamMetrics metrics) {
try {
using var searcherTotal = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem");
foreach (var obj in searcherTotal.Get()) {
double totalBytes = Convert.ToDouble(obj["TotalPhysicalMemory"]);
metrics.TotalGb = Math.Round(totalBytes / (1024.0 * 1024.0 * 1024.0), 2);
}
using var searcherFree = new ManagementObjectSearcher("SELECT FreePhysicalMemory FROM Win32_OperatingSystem");
foreach (var obj in searcherFree.Get()) {
double freeKb = Convert.ToDouble(obj["FreePhysicalMemory"]);
metrics.FreeGb = Math.Round(freeKb / (1024.0 * 1024.0), 2);
}
} catch { }
}
private static void GetLinuxRam(RamMetrics metrics) {
try {
string[] lines = File.ReadAllLines("/proc/meminfo");
var totalParts = lines[0].Split(" ", StringSplitOptions.RemoveEmptyEntries);
var freeParts = lines[1].Split(" ", StringSplitOptions.RemoveEmptyEntries);
metrics.TotalGb = Math.Round(double.Parse(totalParts[1]) / (1024.0 * 1024.0), 2);
metrics.FreeGb = Math.Round(double.Parse(freeParts[1]) / (1024.0 * 1024.0), 2);
} catch { }
}
private static void GetMacRam(RamMetrics metrics) {
try {
var total = BashUtils.GetBashCommandOutput("sysctl -n hw.memsize");
metrics.TotalGb = Math.Round(double.Parse(total) / (1024.0 * 1024.0 * 1024.0), 2);
metrics.FreeGb = 0;
} catch { }
}
}