/// <summary> /// Устанавливает обновление базы данных. /// </summary> /// <param name="ResFileName">Имя файла для обновления</param> /// <param name="UpdateURL">URL загрузки обновления</param> /// <param name="UpdateHash">Контрольная сумма файла обновления</param> /// <returns>Возвращает true при успешной установке обновления, иначе - false.</returns> private bool InstallDatabaseUpdate(string ResFileName, string UpdateURL, string UpdateHash) { // Задаём значения переменных по умолчанию... bool Result = false; // Проверяем наличие прав на запись в каталог... if (FileManager.IsDirectoryWritable(FullAppPath)) { // Генерируем пути к файлам... string UpdateFileName = UpdateManager.GenerateUpdateFileName(Path.Combine(FullAppPath, ResFileName)); string UpdateTempFile = Path.GetTempFileName(); // Загружаем файл с сервера... FormManager.FormShowDownloader(UpdateURL, UpdateTempFile); try { // Проверяем контрольную сумму... if (FileManager.CalculateFileMD5(UpdateTempFile) == UpdateHash) { // Копируем загруженный файл... File.Copy(UpdateTempFile, UpdateFileName, true); // Выводим сообщение об успехе... MessageBox.Show(AppStrings.UPD_UpdateDBSuccessful, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Information); // Возвращаем положительный результат... Result = true; } else { // Выводим сообщение о несовпадении хешей... MessageBox.Show(AppStrings.UPD_HashFailure, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception Ex) { // Выводим сообщение об ошибке... CoreLib.HandleExceptionEx(AppStrings.UPD_UpdateFailure, Properties.Resources.AppName, Ex.Message, Ex.Source, MessageBoxIcon.Error); } // Удаляем загруженный файл если он существует... if (File.Exists(UpdateTempFile)) { File.Delete(UpdateTempFile); } // Повторяем поиск обновлений... CheckForUpdates(); } else { // Выводим сообщение об отсутствии прав на запись в каталог... MessageBox.Show(AppStrings.UPD_NoWritePermissions, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error); } // Возвращаем результат... return(Result); }
/// <summary> /// Устанавливает обновление в виде отдельного исполняемого файла. /// </summary> /// <param name="UpdateURL">URL загрузки обновления</param> /// <param name="UpdateHash">Контрольная сумма файла обновления</param> /// <returns>Возвращает true при успешной установке обновления, иначе - false.</returns> private bool InstallBinaryUpdate(string UpdateURL, string UpdateHash) { // Задаём значения переменных по умолчанию... bool Result = false; // Генерируем имя файла обновления... string UpdateFileName = UpdateManager.GenerateUpdateFileName(Path.Combine(AppUserDir, Path.GetFileName(UpdateURL))); // Загружаем файл асинхронно... FormManager.FormShowDownloader(UpMan.AppUpdateURL, UpdateFileName); // Выполняем проверки и устанавливаем обновление... if (File.Exists(UpdateFileName)) { // Проверяем хеш загруженного файла с эталоном... if (FileManager.CalculateFileMD5(UpdateFileName) == UpdateHash) { // Обновляем дату последней проверки обновлений... UpdateTimeSetApp(); // Выводим сообщение об успешном окончании загрузки и готовности к установке обновления... MessageBox.Show(AppStrings.UPD_UpdateSuccessful, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Information); // Запускаем установку standalone-обновления... try { if (FileManager.IsDirectoryWritable(FullAppPath)) { Process.Start(UpdateFileName); } else { ProcessManager.StartWithUAC(UpdateFileName); } Result = true; } catch (Exception Ex) { CoreLib.HandleExceptionEx(AppStrings.UPD_UpdateFailure, Properties.Resources.AppName, Ex.Message, Ex.Source, MessageBoxIcon.Error); } } else { // Хеш-сумма не совпала, поэтому файл скорее всего повреждён. Удаляем... try { File.Delete(UpdateFileName); } catch (Exception Ex) { CoreLib.WriteStringToLog(Ex.Message); } // Выводим сообщение о несовпадении контрольной суммы... MessageBox.Show(AppStrings.UPD_HashFailure, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { // Не удалось загрузить файл обновления. Выводим сообщение об ошибке... MessageBox.Show(AppStrings.UPD_UpdateFailure, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Warning); } // Повторно запускаем проверку обновлений... CheckForUpdates(); // Возвращаем результат... return(Result); }