61 lines
2.3 KiB
C#
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 { }
|
|
}
|
|
} |