RuntimeStatusHelper.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace Helper
  10. {
  11. public class RuntimeStatusHelper
  12. {
  13. /// <summary>
  14. /// 唯一实例
  15. /// </summary>
  16. public readonly static RuntimeStatusHelper DataManager = new RuntimeStatusHelper();
  17. private PerformanceCounter cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");//保持一个cpu实例,避免重复创建
  18. //定义内存的信息结构
  19. [StructLayout(LayoutKind.Sequential)]
  20. public struct MEMORY_INFO
  21. {
  22. public uint dwLength; //当前结构体大小
  23. public uint dwMemoryLoad; //当前内存使用率
  24. public ulong ullTotalPhys; //总计物理内存大小
  25. public ulong ullAvailPhys; //可用物理内存大小
  26. public ulong ullTotalPageFile; //总计交换文件大小
  27. public ulong ullAvailPageFile; //总计交换文件大小
  28. public ulong ullTotalVirtual; //总计虚拟内存大小
  29. public ulong ullAvailVirtual; //可用虚拟内存大小
  30. public ulong ullAvailExtendedVirtual; //保留 这个值始终为0
  31. }
  32. [DllImport("kernel32")]
  33. [return: MarshalAs(UnmanagedType.Bool)]
  34. public static extern bool GlobalMemoryStatusEx(ref MEMORY_INFO mi);//获取内存相关数据
  35. /// <summary>
  36. /// 构造方法
  37. /// </summary>
  38. private RuntimeStatusHelper()
  39. {
  40. cpu.NextValue();//因为第一次获取CPU使用率总是0,所以在此获取一次CPU使用率,避免画面显示CPU为0的情况
  41. }
  42. /// <summary>
  43. /// 获取电脑磁盘剩余空间
  44. /// </summary>
  45. /// <returns></returns>
  46. public string GetDrivers()
  47. {
  48. string result = "";
  49. DriveInfo[] drives = DriveInfo.GetDrives();
  50. foreach (DriveInfo drive in drives)
  51. {
  52. if (!drive.IsReady)
  53. continue;
  54. if (result.Length > 0) result += ",";
  55. result += string.Format("{0}盘剩余{1}", drive.Name.Split(':')[0] + "盘剩余", FormatSize(drive.TotalFreeSpace));
  56. }
  57. return result;
  58. }
  59. /// <summary>
  60. /// 获取电脑IP地址
  61. /// </summary>
  62. /// <returns></returns>
  63. public string GetIPAddress()
  64. {
  65. string hostName = Dns.GetHostName();
  66. IPAddress[] iPs = Dns.GetHostEntry(hostName).AddressList;
  67. foreach (IPAddress ip in iPs)
  68. {
  69. if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  70. {
  71. return ip.ToString();
  72. }
  73. }
  74. return "";
  75. }
  76. /// <summary>
  77. /// 获取CPU实时占用率
  78. /// </summary>
  79. /// <returns></returns>
  80. public string GetCpuUtilization()
  81. {
  82. return String.Format("{0}", cpu.NextValue());
  83. }
  84. /// <summary>
  85. /// 获取内存实时占用率
  86. /// </summary>
  87. /// <returns></returns>
  88. public string GetMemoryUtilization()
  89. {
  90. return String.Format("{0}/{1}", FormatSize(GetUsedPhys()), FormatSize(GetTotalPhys()));
  91. }
  92. /// <summary>
  93. /// 格式化容量大小
  94. /// </summary>
  95. /// <param name="size">容量(B)</param>
  96. /// <returns>已格式化的容量</returns>
  97. private string FormatSize(double size)
  98. {
  99. double d = (double)size;
  100. int i = 0;
  101. while ((d > 1024) && (i < 5))
  102. {
  103. d /= 1024;
  104. i++;
  105. }
  106. string[] unit = { "B", "KB", "MB", "G", "T" };
  107. return (string.Format("{0} {1}", Math.Round(d, 2), unit[i]));
  108. }
  109. /// <summary>
  110. /// 获得当前内存使用情况
  111. /// </summary>
  112. /// <returns></returns>
  113. public MEMORY_INFO GetMemoryStatus()
  114. {
  115. MEMORY_INFO mi = new MEMORY_INFO();
  116. mi.dwLength = (uint)Marshal.SizeOf(mi);
  117. GlobalMemoryStatusEx(ref mi);
  118. return mi;
  119. }
  120. /// <summary>
  121. /// 获得当前可用物理内存大小
  122. /// </summary>
  123. /// <returns>当前可用物理内存(B)</returns>
  124. public ulong GetAvailPhys()
  125. {
  126. MEMORY_INFO mi = GetMemoryStatus();
  127. return mi.ullAvailPhys;
  128. }
  129. /// <summary>
  130. /// 获得当前已使用的内存大小
  131. /// </summary>
  132. /// <returns>已使用的内存大小(B)</returns>
  133. public ulong GetUsedPhys()
  134. {
  135. MEMORY_INFO mi = GetMemoryStatus();
  136. return (mi.ullTotalPhys - mi.ullAvailPhys);
  137. }
  138. /// <summary>
  139. /// 获得当前总计物理内存大小
  140. /// </summary>
  141. /// <returns&amp;gt;总计物理内存大小(B)&amp;lt;/returns&amp;gt;
  142. public ulong GetTotalPhys()
  143. {
  144. MEMORY_INFO mi = GetMemoryStatus();
  145. return mi.ullTotalPhys;
  146. }
  147. public string GetTurnonTime()
  148. {
  149. return DateTime.Now.AddMilliseconds(-Environment.TickCount).ToString();
  150. }
  151. }
  152. }