private static void ActiveManifestDownVersion() { try { var fileName = GetActiveManifestFileName(); if (File.Exists(fileName)) { var manifest = RTCManifest.Load(fileName); int oldVersion = manifest.Version; manifest.Version--; manifest.Save(); MessageBox.Show("Версия манифеста понижена: " + oldVersion.ToString() + " > " + manifest.Version.ToString()); } else { MessageBox.Show("Файл не найден\r\n" + fileName); } } catch (Exception ex) { LogAndShow("Возникло исключение при открытии активного манифеста", ex); } }
internal static RTCManifest GetActiveManifest() { string aMonFileName = string.Empty; try { aMonFileName = GetActiveManifestFileName(); return(RTCManifest.Load(aMonFileName)); } catch (Exception ex) { LogAndShow("Возникло исключение при загрузке активного манифеста", ex, new LogParameter("Путь к файлу", aMonFileName)); return(null); } }
public static RTCManifest SelectFromFile() { try { OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = false; ofd.Title = "Выберите файл Манифеста"; ofd.CheckFileExists = true; ofd.Filter = "XML | *.xml"; if (!string.IsNullOrEmpty(Properties.Settings.Default.LoadManifestPath)) { ofd.InitialDirectory = Properties.Settings.Default.LoadManifestPath; } if (ofd.ShowDialog() != true) { return(null); } var pathName = ofd.FileName; RTCManifest manifest = null; switch (Path.GetFileName(pathName).ToLower()) { case "rtcmanifest.xml": manifest = RTCManifest.Load(pathName); break; case "ecrmanifest.xml": manifest = ECRManifest.Load(pathName); break; default: manifest = RTCManifest.Load(pathName); //MessageBox.Show("Не удалось определить тип манифеста"); break; } return(manifest); } catch (Exception ex) { MessageBox.Show("Возникло исключение при загрузке файла манифеста: " + ex.Message); return(null); } }
/// <summary> /// Асинхронное получение набора моделей ManifestFileGridItem из файлов Манифеста /// </summary> /// <param name="manifest">Манифест</param> /// <returns>Возвращает запущенную асинхронную задачу, возвращающую набор моделей для Grid'а</returns> public static Task <IEnumerable <ManifestFileGridItem> > GetGridFiles(this RTCManifest manifest) { return(Task.Run <IEnumerable <ManifestFileGridItem> >(() => { var result = new List <ManifestFileGridItem>(); if (manifest.FilesCount() == 0) { return result; } ManifestFileGridItem viewItem = null; var root = manifest.FileInfo == null ? "" : manifest.FileInfo.Directory.FullName; var directory = root; var folder = string.Empty; using (var domain = SeparatedAppDomain.Create()) { foreach (var file in manifest.Files) { folder = file.Folders.First(); if (folder.Equals(RTCManifest.RootDirectoryFlag)) { directory = root; } else { //формируем каталог как указан в манифесте directory = Path.Combine(root, folder); //если папки нет - пробуем загрузить файл из текущего расположения файла манифеста if (!Directory.Exists(directory)) { directory = root; } } var filePath = Path.Combine(directory, file.FileName); viewItem = new ManifestFileGridItem(file, filePath, domain); result.Add(viewItem); } } return result; })); }
private static void ActiveManifestVersion() { try { var fileName = GetActiveManifestFileName(); if (File.Exists(fileName)) { var manifest = RTCManifest.Load(fileName); MessageBox.Show("Версия манифеста: " + manifest.Version.ToString()); } else { MessageBox.Show("Файл не найден\r\n" + fileName); } } catch (Exception ex) { LogAndShow("Возникло исключение при получении версии активного манифеста", ex); } }
/// <summary> /// Загрузка активного манифеста. /// </summary> /// <returns>Возвращает активный манфиест или null, если не найден файл/не удалось загрузить</returns> internal static RTCManifest LoadActiveManifest() { var fileName = string.Empty; try { fileName = GetActiveManifestFileName(); if (File.Exists(fileName)) { return(RTCManifest.Load(fileName)); } } catch (Exception ex) { LogAndShow("Возникло исключение при загрузке активного манифеста", ex , new LogParameter("Путь к файлу", fileName)); } return(null); }
/// <summary> /// Окно выбора файла манфиеста /// </summary> /// <param name="defaultPath">Путь по умочланию</param> /// <param name="pathKey">Ключ для поиска/сохранения пути по умолчанию в Файле настроек</param> /// <returns>Возвращает выбранный файл манифеста или null</returns> public static RTCManifest SelectManifest(string defaultPath = null, string pathKey = null) { try { OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = false; ofd.Title = "Выберите файл Манифеста"; ofd.CheckFileExists = true; ofd.Filter = "XML | *.xml"; MG_Settings settings = null; if (!string.IsNullOrEmpty(pathKey)) { settings = MG_Settings.Load(); if (string.IsNullOrWhiteSpace(defaultPath)) { if (settings.Directories.Contains(pathKey)) //загрузка из файла настроек по ключу каталога по умолчанию { defaultPath = settings.Directories[pathKey]; } } } if (!string.IsNullOrWhiteSpace(defaultPath)) { if (Directory.Exists(defaultPath)) { ofd.InitialDirectory = defaultPath; } } if (ofd.ShowDialog() != true) { return(null); } var pathName = ofd.FileName; RTCManifest manifest = null; switch (Path.GetFileName(pathName).ToLower()) { case "rtcmanifest.xml": manifest = RTCManifest.Load(pathName); break; case "ecrmanifest.xml": manifest = ECRManifest.Load(pathName); break; default: manifest = RTCManifest.Load(pathName); //MessageBox.Show("Не удалось определить тип манифеста"); break; } if (!string.IsNullOrEmpty(pathKey)) { //сохраняем каталог выбранного манифеста в файле настроек settings.Directories.Save(new NamedSettingsValue() { Key = pathKey, Value = manifest.FileInfo.DirectoryName }); } return(manifest); } catch (Exception ex) { LogAndShow("Возникло исключение при загрузке файла манифеста", ex); return(null); } }
internal static Task <ManifestChangeWindow> CheckManifest(RTCManifest manifest, bool active = false) { return(Task.Run(() => { var baseFiles = manifest.Files.OfType <IManifestFileItem>(); var manifestFileName = Path.GetFileNameWithoutExtension(manifest.FileInfo.Name); var manifestFiles = active ? GetActiveManifestFiles() //для активного манифеста собираем файлы по путям, указанным в манифесте : manifest.FileInfo.Directory.GetFiles(); //для прочих манифестов берём файлы из текущего каталога var rawFiles = StaticMethods.RemoveManifestFiles(manifestFiles); if (rawFiles.Count() == 0) { MessageBox.Show("В папке манифеста не найдено файлов для сравнения", "Файлы не найдены"); } List <ManifestFileGridItem> rawFileItems = null; RTCManifest tempManifest = null; //генерируем временный манифест из файлов, что лежат рядом с текущим var root = manifest.FileInfo.Directory; using (var domain = SeparatedAppDomain.Create()) rawFileItems = rawFiles.Select(fi => new ManifestFileGridItem(fi, root, domain)).ToList(); if (active) //при проверке активного манифеста { //выбираем файлы, для которых указано несколько папок var multipleFolderFiles = manifest.Files.Where(fi => fi.Folders.Length > 1); foreach (var fileItem in multipleFolderFiles) { //для каждого находим соответствующую пачку в активных файлах var activeFiles = rawFileItems.Where(rf => rf.FileName.Equals(fileItem.FileName)).ToList(); ManifestFileGridItem tempFile = null; /* * Для одинаковых файлов (по CRC) просто добавляем папку к первому попавшемуся * если в какой-то из папок файл отличается, то его просто пропускаем - на форме высветится красным */ foreach (var aFile in activeFiles) { if (aFile.CRC.Equals(fileItem.CRC)) { if (tempFile == null) { tempFile = aFile; } else { tempFile.AddFolder(aFile.Folders); rawFileItems.Remove(aFile); } } else { aFile.FileName = aFile.FileName + "_" + aFile.CRC; //добавляем CRC-шку для видимости } } tempFile = null; } } tempManifest = RTCManifest.Create(files: rawFileItems); ManifestFileItem baseItem = null; //копируем не значимые параметры из основного манифеста, чтобы не мозолили глаза при сравнении tempManifest.Version = manifest.Version; foreach (var mFile in tempManifest.Files) { baseItem = manifest.GetItemByFileName(mFile.FileName); if (baseItem == null) { continue; } if (baseItem.IsAssembly) { mFile.GAC = baseItem.GAC; mFile.REGASM = baseItem.REGASM; mFile.REGSRV32 = baseItem.REGSRV32; } mFile.Type = baseItem.Type; if (!active) //для активного манифеста важны папки { mFile.Folders = baseItem.Folders; } mFile.Delete = baseItem.Delete; } ManifestChangeWindow window = null; App.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, new Action(() => { var updateWindow = new ManifestChangeWindow(tempManifest, manifest); updateWindow.Title = active ? "Проверка рабочего манифеста" : "Обновление манифеста файлами из того же каталога"; updateWindow.ButtonText = "Обновить манифест"; updateWindow.UpdateEnable = !active; //запрещаем обновление для активного манифеста updateWindow.LeftLoadable = false; updateWindow.RightLoadable = false; window = updateWindow; })).Wait(); return window; })); }