UpgradeOperator.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. namespace Vinno.FIS.Sonopost.Upgrade
  7. {
  8. public class UpgradeOperator
  9. {
  10. private string _upgradeFilePath;
  11. private string _targetPath;
  12. private bool _deleteAllFiles;
  13. private string _sonopostFolderPath;
  14. public UpgradeOperator(string upgradePath, string targetPath, bool deleteAllFiles)
  15. {
  16. _upgradeFilePath = upgradePath;
  17. _targetPath = targetPath;
  18. _deleteAllFiles = deleteAllFiles;
  19. var rootPath = Path.GetPathRoot(targetPath);
  20. _sonopostFolderPath = Path.Combine(rootPath, "Sonopost");
  21. }
  22. public bool StartUpgrade()
  23. {
  24. if (!Directory.Exists(_upgradeFilePath))
  25. {
  26. return false;
  27. }
  28. StopSonopostService();
  29. UninstallSonopostTask();
  30. StopSonopostKeeper();
  31. StopSonopost();
  32. StopTRTCClient();
  33. RunUpgrade();
  34. InstallSonopostTask();
  35. return true;
  36. }
  37. private void DeleteAllFiles()
  38. {
  39. if (!_deleteAllFiles)
  40. {
  41. return;
  42. }
  43. DeleteDirectory(_sonopostFolderPath);
  44. }
  45. private void RestartSonopostService()
  46. {
  47. ServiceHelper.Install();
  48. ServiceHelper.Start();
  49. }
  50. public void InstallSonopostTask()
  51. {
  52. TaskSchedulerHelper.Install();
  53. }
  54. private void RunUpgrade()
  55. {
  56. MoveFiles(_upgradeFilePath, _targetPath);
  57. DeleteEmptyFolder(_targetPath);
  58. DeleteDirectory(_upgradeFilePath);
  59. DeleteAllFiles();
  60. }
  61. private void StopSonopostService()
  62. {
  63. ServiceHelper.Stop();
  64. ServiceHelper.UnInstall();
  65. }
  66. private void UninstallSonopostTask()
  67. {
  68. TaskSchedulerHelper.UnInstall();
  69. }
  70. private void StopSonopost()
  71. {
  72. FinishProcessByName("Sonopost");
  73. }
  74. private void StopTRTCClient()
  75. {
  76. FinishProcessByName("Vinno.FIS.TRTCClient");
  77. }
  78. private void StopSonopostKeeper()
  79. {
  80. FinishProcessByName("Vinno.FIS.Sonopost.Keeper");
  81. }
  82. private void MoveFiles(string srcFolder, string targetFolder)
  83. {
  84. if (!Directory.Exists(targetFolder))
  85. {
  86. Directory.CreateDirectory(targetFolder);
  87. }
  88. var files = Directory.GetFiles(srcFolder);
  89. foreach (var file in files)
  90. {
  91. try
  92. {
  93. File.Copy(file, file.Replace(srcFolder, targetFolder), true);
  94. }
  95. catch (Exception ex)
  96. {
  97. File.AppendAllText("UpgradeLog.txt", ex.ToString());
  98. }
  99. }
  100. var dirs = Directory.GetDirectories(srcFolder);
  101. foreach (var dir in dirs)
  102. {
  103. if (!dir.EndsWith("SonopostUpgrade"))
  104. {
  105. MoveFiles(dir, dir.Replace(srcFolder, targetFolder));
  106. }
  107. }
  108. }
  109. /// <summary>
  110. /// Delete directory
  111. /// </summary>
  112. /// <param name="directory"></param>
  113. private static bool DeleteDirectory(string directory)
  114. {
  115. try
  116. {
  117. if (!Directory.Exists(directory))
  118. {
  119. return true;
  120. }
  121. var files = Directory.GetFiles(directory);
  122. var directories = Directory.GetDirectories(directory);
  123. foreach (var file in files)
  124. {
  125. File.SetAttributes(file, FileAttributes.Normal);
  126. File.Delete(file);
  127. }
  128. foreach (var dir in directories)
  129. {
  130. DeleteDirectory(dir);
  131. }
  132. Directory.Delete(directory, false);
  133. }
  134. catch (Exception ex)
  135. {
  136. File.AppendAllText("UpgradeLog.txt", ex.ToString());
  137. return false;
  138. }
  139. return true;
  140. }
  141. private bool DeleteEmptyFolder(string folder)
  142. {
  143. bool allChildFolderIsDelete = true;
  144. var files = Directory.GetFiles(folder);
  145. var childFolders = Directory.GetDirectories(folder);
  146. if (files.Length > 0)
  147. {
  148. if (childFolders.Length > 0)
  149. {
  150. foreach (var childFolder in childFolders)
  151. {
  152. if (DeleteEmptyFolder(childFolder) == false)
  153. {
  154. allChildFolderIsDelete = false;
  155. }
  156. }
  157. }
  158. return false;
  159. }
  160. else if (childFolders.Length > 0)
  161. {
  162. foreach (var childFolder in childFolders)
  163. {
  164. if (DeleteEmptyFolder(childFolder) == false)
  165. {
  166. allChildFolderIsDelete = false;
  167. }
  168. }
  169. }
  170. else
  171. {
  172. DeleteDirectory(folder);
  173. return true;
  174. }
  175. if (allChildFolderIsDelete && Directory.Exists(folder))
  176. {
  177. DeleteDirectory(folder);
  178. return true;
  179. }
  180. return false;
  181. }
  182. private bool FinishProcessByName(string name)
  183. {
  184. int count = 5;
  185. while (count > 0)
  186. {
  187. var existApps = Process.GetProcessesByName(name).Where(x => x.ProcessName == name);
  188. if (!existApps.Any())
  189. {
  190. return true;
  191. }
  192. foreach (var item in existApps)
  193. {
  194. item.Kill();
  195. Thread.Sleep(1000);
  196. }
  197. count--;
  198. }
  199. return false;
  200. }
  201. }
  202. }