using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Management;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
namespace Hh.Mes.Common
{
public class ComputerHelp
{
/// <summary>
/// 端口是否被占用
/// </summary>
public static bool PortInUse(int port)
{
bool inUse = false;
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
var ipEndPoints = ipProperties.GetActiveTcpListeners();
foreach (IPEndPoint endPoint in ipEndPoints)
{
if (endPoint.Port == port)
{
inUse = true;
break;
}
}
return inUse;
}
/// <summary>
/// 获取本地IP地址信息
/// </summary>
public static string GetAddressIP()
{
//获取本地的IP地址
string AddressIP = string.Empty;
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (_IPAddress.AddressFamily==AddressFamily.InterNetwork|| _IPAddress.AddressFamily== AddressFamily.InterNetworkV6)
{
AddressIP = _IPAddress.ToString();
}
}
return AddressIP;
}
/// <summary>
/// 获取CPU信息
/// </summary>
/// <returns></returns>
public static Dictionary<string, string> GetCPUInfo()
{
var result = new Dictionary<string, string>();
//var mc = new ManagementClass("win32_processor");//创建ManagementClass对象
//var moc = mc.GetInstances();//获取CPU信息
//foreach (var mo in moc.Cast<ManagementObject>())
//{
// mo["processorid"].ToString();//获取CUP编号
//}
var driveID = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");//查询CPU信息
int index = 1;
foreach (var MyXianKa in driveID.Get().Cast<ManagementObject>())
{
foreach (var item in MyXianKa.Properties)
{
if (!result.ContainsKey(item.Name))
{
result.Add(item.Name, item.Value?.ToString());
}
else
{
result.Add(item.Name + index, item.Value?.ToString());
}
}
index++;
//MyXianKa.["Manufacturer"].ToString();//获取CUP制造商名称
//MyXianKa["Version"].ToString();//获取CPU版本号
//MyXianKa["Name"].ToString();//获取CUP产品名称
}
return result;
}
/// <summary>
/// 获取CPU占用百分比
/// </summary>
/// <returns></returns>
public static string GetCpuUsage()
{
//var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
//return cpuCounter.NextValue();
var result = string.Empty;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\"");
var cpuItem = searcher.Get().Cast<ManagementObject>().Select(item => new { PercentProcessorTime = item["PercentProcessorTime"] }).FirstOrDefault();
if (cpuItem != null && cpuItem.PercentProcessorTime != null)
{
result = cpuItem.PercentProcessorTime.ToString() + "%";
}
else
{
result = "获取失败";
}
return result;
}
/// <summary>
/// 获取系统内存使用情况
/// </summary>
/// <remarks>需要添加 System.Management 的引用</remarks>
/// <returns>item1=总内存,item2=可使用,item3=已使用,item4=占用百分比</returns>
public static ValueTuple<string, string, string, string> GetMemery()
{
//获取总物理内存大小
var cimobject1 = new ManagementClass("Win32_PhysicalMemory");
var moc1 = cimobject1.GetInstances();
double available = 0, capacity = 0;
foreach (var mo1 in moc1.Cast<ManagementObject>())
{
capacity += Math.Round(long.Parse(mo1.Properties["Capacity"].Value.ToString()) / 1024 / 1024 / 1024.0, 1);
}
moc1.Dispose();
cimobject1.Dispose();
//获取内存可用大小
var cimobject2 = new ManagementClass("Win32_PerfFormattedData_PerfOS_Memory");
var moc2 = cimobject2.GetInstances();
foreach (var mo2 in moc2.Cast<ManagementObject>())
{
available += Math.Round(long.Parse(mo2.Properties["AvailableMBytes"].Value.ToString()) / 1024.0, 1);
}
moc2.Dispose();
cimobject2.Dispose();
//总内存
var Total = capacity.ToString() + "G";
//可使用
var Sys = available.ToString() + "G";
//已使用
string Used = (capacity - available).ToString() + "G";
//占用百分比
var Usage = Math.Round((capacity - available) * 100 / capacity, 0).ToString() + "%";
return (Total, Sys, Used, Usage);
}
/// <summary>
/// 获取磁盘信息
/// </summary>
/// <returns></returns>
public static List<DriveInfo> GetDriveInfos()
{
var allDirves = DriveInfo.GetDrives();
return allDirves.Where(x => x.IsReady).ToList();
}
/// <summary>
/// 获取电脑名称
/// </summary>
/// <returns></returns>
public static string GetComputerName()
{
return Environment.MachineName;
}
/// <summary>
/// 获取操作系统信息
/// </summary>
/// <returns></returns>
public static Dictionary<string, string> GetOSInfo()
{
var result = new Dictionary<string, string>();
var mc = new ManagementClass("Win32_OperatingSystem");
var moc = mc.GetInstances();
foreach (var mo in moc.Cast<ManagementObject>())
{
foreach (var item in mo.Properties)
{
result.Add(item.Name, item.Value?.ToString());
}
}
return result;
}
/// <summary>
/// 执行cmd命令 https://www.cnblogs.com/njl041x/p/3881550.html
/// 多命令请使用批处理命令连接符:
/// <![CDATA[
/// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
/// 其他请百度
/// </summary>
public static void RunCmd(string cmd, string cmdPath, out string output)
{
cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
using (var p = new Process())
{
p.StartInfo.FileName = cmdPath;
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
p.StartInfo.CreateNoWindow = true; //不显示程序窗口
p.Start();//启动程序
//向cmd窗口写入命令
p.StandardInput.WriteLine(cmd);
p.StandardInput.AutoFlush = true;
//获取cmd窗口的输出信息
output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
}
}
}
}