using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; namespace Vinno.FIS.Sonopost.Upgrade { public class UpgradeOperator { private string _upgradeFilePath; private string _targetPath; private bool _deleteAllFiles; private string _sonopostFolderPath; public UpgradeOperator(string upgradePath, string targetPath, bool deleteAllFiles) { _upgradeFilePath = upgradePath; _targetPath = targetPath; _deleteAllFiles = deleteAllFiles; var rootPath = Path.GetPathRoot(targetPath); _sonopostFolderPath = Path.Combine(rootPath, "Sonopost"); } public bool StartUpgrade() { if (!Directory.Exists(_upgradeFilePath)) { return false; } StopSonopostService(); UninstallSonopostTask(); StopSonopostKeeper(); StopSonopost(); StopTRTCClient(); RunUpgrade(); InstallSonopostTask(); return true; } private void DeleteAllFiles() { if (!_deleteAllFiles) { return; } DeleteDirectory(_sonopostFolderPath); } private void RestartSonopostService() { ServiceHelper.Install(); ServiceHelper.Start(); } public void InstallSonopostTask() { TaskSchedulerHelper.Install(); } private void RunUpgrade() { MoveFiles(_upgradeFilePath, _targetPath); DeleteEmptyFolder(_targetPath); DeleteDirectory(_upgradeFilePath); DeleteAllFiles(); } private void StopSonopostService() { ServiceHelper.Stop(); ServiceHelper.UnInstall(); } private void UninstallSonopostTask() { TaskSchedulerHelper.UnInstall(); } private void StopSonopost() { FinishProcessByName("Sonopost"); } private void StopTRTCClient() { FinishProcessByName("Vinno.FIS.TRTCClient"); } private void StopSonopostKeeper() { FinishProcessByName("Vinno.FIS.Sonopost.Keeper"); } private void MoveFiles(string srcFolder, string targetFolder) { if (!Directory.Exists(targetFolder)) { Directory.CreateDirectory(targetFolder); } var files = Directory.GetFiles(srcFolder); foreach (var file in files) { try { File.Copy(file, file.Replace(srcFolder, targetFolder), true); } catch (Exception ex) { File.AppendAllText("UpgradeLog.txt", ex.ToString()); } } var dirs = Directory.GetDirectories(srcFolder); foreach (var dir in dirs) { if (!dir.EndsWith("SonopostUpgrade")) { MoveFiles(dir, dir.Replace(srcFolder, targetFolder)); } } } /// /// Delete directory /// /// private static bool DeleteDirectory(string directory) { try { if (!Directory.Exists(directory)) { return true; } var files = Directory.GetFiles(directory); var directories = Directory.GetDirectories(directory); foreach (var file in files) { File.SetAttributes(file, FileAttributes.Normal); File.Delete(file); } foreach (var dir in directories) { DeleteDirectory(dir); } Directory.Delete(directory, false); } catch (Exception ex) { File.AppendAllText("UpgradeLog.txt", ex.ToString()); return false; } return true; } private bool DeleteEmptyFolder(string folder) { bool allChildFolderIsDelete = true; var files = Directory.GetFiles(folder); var childFolders = Directory.GetDirectories(folder); if (files.Length > 0) { if (childFolders.Length > 0) { foreach (var childFolder in childFolders) { if (DeleteEmptyFolder(childFolder) == false) { allChildFolderIsDelete = false; } } } return false; } else if (childFolders.Length > 0) { foreach (var childFolder in childFolders) { if (DeleteEmptyFolder(childFolder) == false) { allChildFolderIsDelete = false; } } } else { DeleteDirectory(folder); return true; } if (allChildFolderIsDelete && Directory.Exists(folder)) { DeleteDirectory(folder); return true; } return false; } private bool FinishProcessByName(string name) { int count = 5; while (count > 0) { var existApps = Process.GetProcessesByName(name).Where(x => x.ProcessName == name); if (!existApps.Any()) { return true; } foreach (var item in existApps) { item.Kill(); Thread.Sleep(1000); } count--; } return false; } } }