UpgradeFilesCreater.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. namespace PackingPress.Common
  9. {
  10. public class UpgradeFilesCreater
  11. {
  12. private Dictionary<string, UpgradeFileInfo> _fileVersionDic = new Dictionary<string, UpgradeFileInfo>();
  13. private string _rootPath;
  14. private void ReadFiles(string path)
  15. {
  16. var files = Directory.GetFiles(path);
  17. foreach (var file in files)
  18. {
  19. try
  20. {
  21. var fileInfo = new FileInfo(file);
  22. var fileVersionInfo = FileVersionInfo.GetVersionInfo(file);
  23. var lastWriteTime = fileInfo.LastWriteTimeUtc;
  24. var fileSize = fileInfo.Length;
  25. var fileVersion = lastWriteTime.ToString("yyyyMMddHHmmss") + "." + fileSize;
  26. var productVersion = fileVersionInfo.FileVersion;
  27. var fileShortPath = file.Replace(_rootPath.TrimEnd('\\') + "\\", "RootPath\\");
  28. _fileVersionDic.Add(fileShortPath, new UpgradeFileInfo
  29. {
  30. FileVersion = fileVersion,
  31. ProductVersion = productVersion,
  32. Md5Code = GetMd5(file),
  33. LastWriteTime = lastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"),
  34. Size = fileSize
  35. });
  36. }
  37. catch (Exception ex)
  38. {
  39. FileHelper.AppendWriteFile("InstallLog.txt", $"\r\nReadFiles error {ex}");
  40. }
  41. }
  42. var dirs = Directory.GetDirectories(path);
  43. if (dirs != null && dirs.Length > 0)
  44. {
  45. foreach (var dir in dirs)
  46. {
  47. ReadFiles(dir);
  48. }
  49. }
  50. }
  51. private string GetMd5(string FilePath)
  52. {
  53. var file = File.ReadAllBytes(FilePath);
  54. var md5 = System.Security.Cryptography.MD5.Create();
  55. var md5Str = BitConverter.ToString(md5.ComputeHash(file)).Replace("-", "");
  56. return md5Str;
  57. }
  58. /// <summary>
  59. /// 获取文件版本列表
  60. /// </summary>
  61. /// <param name="path"></param>
  62. /// <param name="outPath"></param>
  63. /// <returns></returns>
  64. private string StartReaderJson(string path, string outPath)
  65. {
  66. _fileVersionDic.Clear();
  67. _rootPath = path;
  68. ReadFiles(path);
  69. var json = JsonConvert.SerializeObject(_fileVersionDic);
  70. using (FileStream fileStream = new FileStream(outPath, FileMode.Create))
  71. {
  72. using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8))
  73. {
  74. streamWriter.Write(json);
  75. streamWriter.Flush();
  76. }
  77. }
  78. return json;
  79. }
  80. /// <summary>
  81. /// 将最新安装包生成压缩文件目录
  82. /// </summary>
  83. /// <param name="newClientPath"></param>
  84. /// <param name="upgradeFilePath"></param>
  85. /// <param name="dic"></param>
  86. private void CreateZipFile(string newClientPath, string upgradeFilePath)
  87. {
  88. var currentVersionClient = AppDomain.CurrentDomain.BaseDirectory + "CurrentVersionClient";
  89. if (File.Exists(upgradeFilePath))
  90. {
  91. Directory.Delete(upgradeFilePath, true);
  92. }
  93. if (File.Exists(currentVersionClient))
  94. {
  95. Directory.Delete(currentVersionClient, true);
  96. }
  97. Directory.CreateDirectory(currentVersionClient);
  98. ZipHelper.DeZip(newClientPath, currentVersionClient, true);
  99. Directory.CreateDirectory(upgradeFilePath);
  100. string json;
  101. File.Move(Path.Combine(currentVersionClient, "vCloud.Windows.Upgrade.exe"), Path.Combine(currentVersionClient, "vCloud.Windows.NewUpgrade.exe"));
  102. var fileListPath = Path.Combine(currentVersionClient, "FileList.json");
  103. var tempFileListPath = Path.Combine(upgradeFilePath, "FileList.json");
  104. if (File.Exists(fileListPath))
  105. {
  106. json = File.ReadAllText(fileListPath);
  107. }
  108. else
  109. {
  110. json = StartReaderJson(currentVersionClient, upgradeFilePath + "\\FileList.json");
  111. }
  112. var dic = JsonConvert.DeserializeObject<Dictionary<string, UpgradeFileInfo>>(json);
  113. if (dic != null && dic.Count > 0)
  114. {
  115. var newUpgrade = dic.FirstOrDefault(f => f.Key == "RootPath\\vCloud.Windows.Upgrade.exe");
  116. dic.Add(newUpgrade.Key.Replace(".Upgrade.", ".NewUpgrade."), newUpgrade.Value);
  117. dic.Remove(newUpgrade.Key);
  118. File.WriteAllText(fileListPath, JsonConvert.SerializeObject(dic));
  119. File.Copy(fileListPath, tempFileListPath, true);
  120. foreach (var keyValue in dic)
  121. {
  122. try
  123. {
  124. if (keyValue.Key.IndexOf("FileList.json") > -1) { continue; }
  125. var realPath = keyValue.Key.Replace("RootPath\\", currentVersionClient + "\\");
  126. var shortPath = keyValue.Key.Replace("RootPath\\", "");
  127. var targetPath = upgradeFilePath + "\\" + shortPath;
  128. Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
  129. File.Copy(realPath, targetPath, true);
  130. ZipHelper.EnZip(targetPath, targetPath + ".zip");
  131. File.Delete(targetPath);
  132. }
  133. catch (Exception ex)
  134. {
  135. FileHelper.AppendWriteFile("InstallLog.txt", $"\r\nCreateZipFile error {ex}");
  136. }
  137. }
  138. }
  139. if (Directory.Exists(currentVersionClient))
  140. {
  141. Directory.Delete(currentVersionClient, true);
  142. }
  143. }
  144. /// <summary>
  145. /// 生成更新包
  146. /// </summary>
  147. /// <param name="pcClientPath">客户端文件地址</param>
  148. /// <param name="outputPath">输出文件目录</param>
  149. public void CreateUpgradePackage(string pcClientPath, string outputPath)
  150. {
  151. if (File.Exists(pcClientPath))
  152. {
  153. if (File.Exists(Path.Combine(outputPath, "UpgradeFiles")))
  154. {
  155. Directory.Delete(Path.Combine(outputPath, "UpgradeFiles"), true);
  156. }
  157. CreateZipFile(pcClientPath, Path.Combine(outputPath, "UpgradeFiles"));
  158. }
  159. }
  160. }
  161. [Serializable]
  162. public class UpgradeFileInfo
  163. {
  164. /// <summary>
  165. /// 最后写入时间
  166. /// </summary>
  167. public string LastWriteTime { get; set; }
  168. /// <summary>
  169. /// 文件大小
  170. /// </summary>
  171. public long Size { get; set; }
  172. /// <summary>
  173. /// 文件版本
  174. /// </summary>
  175. public string FileVersion { get; set; }
  176. /// <summary>
  177. /// 产品版本
  178. /// </summary>
  179. public string ProductVersion { get; set; }
  180. /// <summary>
  181. /// 文件MD5
  182. /// </summary>
  183. public string Md5Code { get; set; }
  184. /// <summary>
  185. /// 文件操作类型
  186. /// </summary>
  187. public UpgradeOperateType Type { get; set; }
  188. }
  189. public enum UpgradeOperateType
  190. {
  191. Add,
  192. Remove
  193. }
  194. }