Cleaner.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using NTMiner.Core.Kernels;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. namespace NTMiner {
  7. public class Cleaner {
  8. public static Cleaner Instance { get; private set; } = new Cleaner();
  9. private Cleaner() {
  10. VirtualRoot.BuildEventPath<Per24HourEvent>("周期清理过期日志、过期内核包、过期下载文件", LogEnum.DevConsole, message => {
  11. AutoClear();
  12. }, this.GetType());
  13. }
  14. public void Clear() {
  15. CleanKernels();
  16. AutoClear();
  17. }
  18. private void AutoClear() {
  19. ClearLogs();
  20. ClearPackages();
  21. ClearDownload();
  22. }
  23. /// <summary>
  24. /// 启动时删除Temp/Download目录下的下载文件,启动时调一次即可
  25. /// </summary>
  26. private void ClearDownload() {
  27. try {
  28. foreach (var fileFullName in Directory.GetFiles(MinerClientTempPath.DownloadDirFullName)) {
  29. FileInfo fileInfo = new FileInfo(fileFullName);
  30. if (fileInfo.LastWriteTime.AddDays(1) < DateTime.Now) {
  31. try {
  32. File.Delete(fileFullName);
  33. }
  34. catch {
  35. }
  36. }
  37. }
  38. }
  39. catch (Exception e) {
  40. Logger.ErrorDebugLine(e);
  41. }
  42. }
  43. /// <summary>
  44. /// 清理掉下载时间超过1个月且服务器已经删除的内核包
  45. /// </summary>
  46. private void ClearPackages() {
  47. HashSet<string> packageFileNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  48. foreach (var kernel in NTMinerContext.Instance.ServerContext.KernelSet.AsEnumerable().ToArray()) {
  49. if (!string.IsNullOrEmpty(kernel.Package)) {
  50. packageFileNames.Add(kernel.Package);
  51. }
  52. }
  53. try {
  54. int n = 0;
  55. foreach (string fileFullName in Directory.GetFiles(HomePath.PackagesDirFullName)) {
  56. FileInfo fileInfo = new FileInfo(fileFullName);
  57. bool isPackageExitInServer = packageFileNames.Contains(fileInfo.Name);
  58. if (isPackageExitInServer) {
  59. continue;
  60. }
  61. if (fileInfo.LastWriteTime.AddMonths(1) < DateTime.Now) {
  62. try {
  63. File.Delete(fileFullName);
  64. }
  65. catch {
  66. }
  67. n++;
  68. }
  69. }
  70. if (n == 0) {
  71. Logger.OkDebugLine("没有过期的Package");
  72. }
  73. else {
  74. Logger.OkDebugLine("过期Package清理完成");
  75. }
  76. }
  77. catch (Exception e) {
  78. Logger.ErrorDebugLine(e);
  79. }
  80. }
  81. /// <summary>
  82. /// 删除除当前正在挖矿的内核外的包解压目录
  83. /// </summary>
  84. private void CleanKernels() {
  85. try {
  86. foreach (var kernelProcessName in NTMinerContext.Instance.ServerContext.KernelSet.GetAllKernelProcessNames()) {
  87. if (!NTMinerContext.Instance.IsMining || NTMinerContext.Instance.LockedMineContext.Kernel.GetProcessName() != kernelProcessName) {
  88. Windows.TaskKill.Kill(kernelProcessName, waitForExit: true);
  89. }
  90. }
  91. string currentKernelDir = string.Empty;
  92. var currentMineContext = NTMinerContext.Instance.LockedMineContext;
  93. if (currentMineContext != null && currentMineContext.Kernel != null) {
  94. currentKernelDir = currentMineContext.Kernel.GetKernelDirFullName();
  95. }
  96. foreach (string dir in Directory.GetDirectories(MinerClientTempPath.KernelsDirFullName)) {
  97. if (string.IsNullOrEmpty(currentKernelDir) || dir != currentKernelDir) {
  98. try {
  99. Directory.Delete(dir, recursive: true);
  100. }
  101. catch (Exception e) {
  102. Logger.ErrorDebugLine(e);
  103. }
  104. }
  105. }
  106. }
  107. catch (Exception e) {
  108. Logger.ErrorDebugLine(e);
  109. }
  110. }
  111. private void ClearLogs() {
  112. try {
  113. List<string> toRemoves = new List<string>();
  114. foreach (var fileFullName in Directory.GetFiles(TempPath.TempLogsDirFullName)) {
  115. FileInfo fileInfo = new FileInfo(fileFullName);
  116. if (fileInfo.LastWriteTime.AddDays(7) < DateTime.Now) {
  117. toRemoves.Add(fileFullName);
  118. }
  119. }
  120. if (toRemoves.Count == 0) {
  121. Logger.OkDebugLine("没有过期的Log");
  122. }
  123. else {
  124. foreach (var fileFullName in toRemoves) {
  125. try {
  126. File.Delete(fileFullName);
  127. }
  128. catch {
  129. }
  130. }
  131. Logger.OkDebugLine("过期Log清理完成");
  132. }
  133. }
  134. catch (Exception e) {
  135. Logger.ErrorDebugLine(e);
  136. }
  137. }
  138. }
  139. }