123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- using Newtonsoft.Json;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- namespace PackingPress.Common
- {
- public class UpgradeFilesCreater
- {
- private Dictionary<string, UpgradeFileInfo> _fileVersionDic = new Dictionary<string, UpgradeFileInfo>();
- private string _rootPath;
- private void ReadFiles(string path)
- {
- var files = Directory.GetFiles(path);
- foreach (var file in files)
- {
- try
- {
- var fileInfo = new FileInfo(file);
- var fileVersionInfo = FileVersionInfo.GetVersionInfo(file);
- var lastWriteTime = fileInfo.LastWriteTimeUtc;
- var fileSize = fileInfo.Length;
- var fileVersion = lastWriteTime.ToString("yyyyMMddHHmmss") + "." + fileSize;
- var productVersion = fileVersionInfo.FileVersion;
- var fileShortPath = file.Replace(_rootPath.TrimEnd('\\') + "\\", "RootPath\\");
- _fileVersionDic.Add(fileShortPath, new UpgradeFileInfo
- {
- FileVersion = fileVersion,
- ProductVersion = productVersion,
- Md5Code = GetMd5(file),
- LastWriteTime = lastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"),
- Size = fileSize
- });
- }
- catch (Exception ex)
- {
- FileHelper.AppendWriteFile("InstallLog.txt", $"\r\nReadFiles error {ex}");
- }
- }
- var dirs = Directory.GetDirectories(path);
- if (dirs != null && dirs.Length > 0)
- {
- foreach (var dir in dirs)
- {
- ReadFiles(dir);
- }
- }
- }
- private string GetMd5(string FilePath)
- {
- var file = File.ReadAllBytes(FilePath);
- var md5 = System.Security.Cryptography.MD5.Create();
- var md5Str = BitConverter.ToString(md5.ComputeHash(file)).Replace("-", "");
- return md5Str;
- }
- /// <summary>
- /// 获取文件版本列表
- /// </summary>
- /// <param name="path"></param>
- /// <param name="outPath"></param>
- /// <returns></returns>
- private string StartReaderJson(string path, string outPath)
- {
- _fileVersionDic.Clear();
- _rootPath = path;
- ReadFiles(path);
- var json = JsonConvert.SerializeObject(_fileVersionDic);
- using (FileStream fileStream = new FileStream(outPath, FileMode.Create))
- {
- using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8))
- {
- streamWriter.Write(json);
- streamWriter.Flush();
- }
- }
- return json;
- }
- /// <summary>
- /// 将最新安装包生成压缩文件目录
- /// </summary>
- /// <param name="newClientPath"></param>
- /// <param name="upgradeFilePath"></param>
- /// <param name="dic"></param>
- private void CreateZipFile(string newClientPath, string upgradeFilePath)
- {
- var currentVersionClient = AppDomain.CurrentDomain.BaseDirectory + "CurrentVersionClient";
- if (File.Exists(upgradeFilePath))
- {
- Directory.Delete(upgradeFilePath, true);
- }
- if (File.Exists(currentVersionClient))
- {
- Directory.Delete(currentVersionClient, true);
- }
- Directory.CreateDirectory(currentVersionClient);
- ZipHelper.DeZip(newClientPath, currentVersionClient, true);
- Directory.CreateDirectory(upgradeFilePath);
- string json;
- File.Move(Path.Combine(currentVersionClient, "vCloud.Windows.Upgrade.exe"), Path.Combine(currentVersionClient, "vCloud.Windows.NewUpgrade.exe"));
- var fileListPath = Path.Combine(currentVersionClient, "FileList.json");
- var tempFileListPath = Path.Combine(upgradeFilePath, "FileList.json");
- if (File.Exists(fileListPath))
- {
- json = File.ReadAllText(fileListPath);
- }
- else
- {
- json = StartReaderJson(currentVersionClient, upgradeFilePath + "\\FileList.json");
- }
- var dic = JsonConvert.DeserializeObject<Dictionary<string, UpgradeFileInfo>>(json);
- if (dic != null && dic.Count > 0)
- {
- var newUpgrade = dic.FirstOrDefault(f => f.Key == "RootPath\\vCloud.Windows.Upgrade.exe");
- dic.Add(newUpgrade.Key.Replace(".Upgrade.", ".NewUpgrade."), newUpgrade.Value);
- dic.Remove(newUpgrade.Key);
- File.WriteAllText(fileListPath, JsonConvert.SerializeObject(dic));
- File.Copy(fileListPath, tempFileListPath, true);
- foreach (var keyValue in dic)
- {
- try
- {
- if (keyValue.Key.IndexOf("FileList.json") > -1) { continue; }
- var realPath = keyValue.Key.Replace("RootPath\\", currentVersionClient + "\\");
- var shortPath = keyValue.Key.Replace("RootPath\\", "");
- var targetPath = upgradeFilePath + "\\" + shortPath;
- Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
- File.Copy(realPath, targetPath, true);
- ZipHelper.EnZip(targetPath, targetPath + ".zip");
- File.Delete(targetPath);
- }
- catch (Exception ex)
- {
- FileHelper.AppendWriteFile("InstallLog.txt", $"\r\nCreateZipFile error {ex}");
- }
- }
- }
- if (Directory.Exists(currentVersionClient))
- {
- Directory.Delete(currentVersionClient, true);
- }
- }
- /// <summary>
- /// 生成更新包
- /// </summary>
- /// <param name="pcClientPath">客户端文件地址</param>
- /// <param name="outputPath">输出文件目录</param>
- public void CreateUpgradePackage(string pcClientPath, string outputPath)
- {
- if (File.Exists(pcClientPath))
- {
- if (File.Exists(Path.Combine(outputPath, "UpgradeFiles")))
- {
- Directory.Delete(Path.Combine(outputPath, "UpgradeFiles"), true);
- }
- CreateZipFile(pcClientPath, Path.Combine(outputPath, "UpgradeFiles"));
- }
- }
- }
- [Serializable]
- public class UpgradeFileInfo
- {
- /// <summary>
- /// 最后写入时间
- /// </summary>
- public string LastWriteTime { get; set; }
- /// <summary>
- /// 文件大小
- /// </summary>
- public long Size { get; set; }
- /// <summary>
- /// 文件版本
- /// </summary>
- public string FileVersion { get; set; }
- /// <summary>
- /// 产品版本
- /// </summary>
- public string ProductVersion { get; set; }
- /// <summary>
- /// 文件MD5
- /// </summary>
- public string Md5Code { get; set; }
- /// <summary>
- /// 文件操作类型
- /// </summary>
- public UpgradeOperateType Type { get; set; }
- }
- public enum UpgradeOperateType
- {
- Add,
- Remove
- }
- }
|