Обновить программу нажатием на кнопку - C#
Формулировка задачи:
Здравствуйте!
Помогите сделать на Form1 кнопку этой функции
Форма Updater
Новая версия загружается, а вот функцию не выполняется, должна закрыться, удалиться, потом открыться уже новая версия. Но по крайне мере так делается если функция вызывается из Program
Листинг программы
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Updater up = new Updater();
- if (up.download())
- Application.Run(up);
- if (up.skipped())
- Application.Run(new Form1());
- }
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading;
- using System.Windows.Forms;
- namespace Online
- {
- public partial class Updater : Form
- {
- public static string my_version = "1.0.0.0"; // версия текущей программы
- public static string url_version = "http://mysite.ru/client/version.txt"; // версия программы
- private string url_program = "http://mysite.ru/client/myprogram.exe"; // новая версия программы
- private string url_foruser = "https://mysite.ru/index.html"; // ссылка, если обновление не удалось
- private string my_filename;
- private string up_filename;
- // Признак, что началось скачивание обновления, требуется ожидание завершения процесса
- private bool is_download; public bool download() { return is_download; }
- // Признак, что обновление не требуется или закончено, можно запускать программу.
- private bool is_skipped; public bool skipped() { return is_skipped; }
- public Updater()
- {
- my_filename = get_exec_filename(); // имя запущенной программы
- up_filename = "new." + my_filename; // имя временного файла для новой версии
- string[] keys = Environment.GetCommandLineArgs();
- if (keys.Length < 3)
- do_check_update();
- else
- {
- if (keys[1].ToLower() == "/u")
- do_copy_downloaded_program(keys[2]);
- if (keys[1].ToLower() == "/d")
- do_delete_old_program(keys[2]);
- }
- }
- private void do_check_update()
- {
- string new_version = get_server_version(); // Получаем номер последней версии
- if (my_version == new_version) // Если обновление не нужно
- {
- is_download = false;
- is_skipped = true; // Пропускаем модуль обновления
- }
- else
- do_download_update(); // Запускаем скачивание новой версии
- }
- private void do_download_update()
- {
- InitializeComponent();
- label_status.Text = "Обновление ForBloody...";
- download_file();
- is_download = true; // Будем ждать завершения процесса
- is_skipped = false; // Основную форму не нужно запускать
- }
- private void download_file()
- {
- try
- {
- WebClient webClient = new WebClient();
- webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
- webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
- webClient.DownloadFileAsync(new Uri(url_program), up_filename);
- }
- catch (Exception ex)
- {
- error(ex.Message + " " + up_filename);
- }
- }
- private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
- {
- progress_download.Value = e.ProgressPercentage;
- label1.Text = string.Format("Загрузка обновления " + progress_download.Value + "% " + "({0} KB's / {1} KB's)...", (e.BytesReceived / 1024d / 1024d).ToString("0.000"), (e.TotalBytesToReceive / 1024d / 1024d).ToString("0.000"));
- }
- private void Completed(object sender, AsyncCompletedEventArgs e)
- {
- // Запускаем второй этап обновления
- run_program(up_filename, "/u "" + my_filename + """);
- this.Close();
- }
- private void run_program(string filename, string keys)
- {
- try
- {
- System.Diagnostics.Process proc = new System.Diagnostics.Process();
- proc.StartInfo.WorkingDirectory = Application.StartupPath;
- proc.StartInfo.FileName = filename;
- proc.StartInfo.Arguments = keys; // Аргументы командной строки
- proc.Start(); // Запускаем!
- }
- catch (Exception ex)
- {
- error(ex.Message + " " + filename);
- }
- }
- void do_copy_downloaded_program(string filename)
- {
- try_to_delete_file(filename);
- try
- {
- File.Copy(my_filename, filename);
- // Запускаем последний этап обновления
- run_program(filename, "/d "" + my_filename + """);
- is_download = false;
- is_skipped = false;
- }
- catch (Exception ex)
- {
- error(ex.Message + " " + filename);
- }
- }
- void do_delete_old_program(string filename)
- {
- try_to_delete_file(filename);
- is_download = false;
- is_skipped = true;
- }
- private void try_to_delete_file(string filename)
- {
- int loop = 10;
- while (--loop > 0 && File.Exists(filename))
- try
- {
- File.Delete(filename);
- }
- catch
- {
- Thread.Sleep(200);
- }
- }
- public static string get_server_version()
- {
- try
- {
- WebClient webClient = new WebClient();
- return webClient.DownloadString(url_version).Trim();
- }
- catch
- {
- // Если номер версии не можем получить,
- // то программу даже и не надо пытаться.
- return my_version;
- }
- }
- private void error(string message)
- {
- if (DialogResult.Yes == MessageBox.Show(
- "Ошибка обновления: что то пошло не так!" +
- "\nСкачать обновленную версию с сайта вручную?",
- "Ошибка", MessageBoxButtons.YesNo))
- OpenLink(url_foruser);
- is_download = false;
- is_skipped = false; // в случае ошибки ничего не запускаем
- }
- private void OpenLink(string sUrl)
- {
- try
- {
- System.Diagnostics.Process.Start(sUrl);
- }
- catch (Exception exc1)
- {
- if (exc1.GetType().ToString() != "System.ComponentModel.Win32Exception")
- try
- {
- System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("IExplore.exe", sUrl);
- System.Diagnostics.Process.Start(startInfo);
- startInfo = null;
- }
- catch (Exception)
- {
- MessageBox.Show("Запустить обозреватель, к сожалению, не удалось.\n\nОткройте страницу ручным способом:\n" + sUrl, "ОШИБКА");
- }
- }
- }
- private string get_exec_filename()
- {
- string fullname = Application.ExecutablePath;
- string[] split = { "" };
- string[] parts = fullname.Split(split, StringSplitOptions.None);
- if (parts.Length > 0)
- return parts[parts.Length - 1];
- return "";
- }
- }
- }
Вроде так:
Листинг программы
- private void button1_Click(object sender, EventArgs e)
- {
- Updater up = new Updater();
- up.download();
- }
Решение задачи: «Обновить программу нажатием на кнопку»
textual
Листинг программы
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Updater up = new Updater();
- if (up.download())
- Application.Run(up);
- if (up.skipped())
- Application.Run(new Form1());
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д