Создание автообновления

228
29 сентября 2017, 15:45

Я пытался создать автообновление своей программы через zip-архив. Для этого использую DotNetZip (Ionic.Zip.dll). Примерно авто-обновление происходит вот так: скачивается тестовый документ с сайта (в к-ром цифра версии), читается версия, если она больше чем версия в Preferences.Settings.Default.ver то Preferences.Settings.Default.ver = ver:

WebClient wc = new WebClient();
                string url = "http://f0160057.xsph.ru/osiddev/app/version.txt";
                string file = "version.txt";
                wc.DownloadFile(url, file);
                StreamReader sr = new StreamReader("version.txt");
            ver = int.Parse(sr.ReadLine());

Cкачивается архив (update.zip) и запускается DDctD_UpTW.exe (главный exe выключается через Process...Kill();:

ver = int.Parse(sr.ReadLine());
if (Properties.Settings.Default.ver < ver)
                {
                    MessageBox.Show("New version available");
                    wc.DownloadFileAsync(new Uri(@"http://f0160057.xsph.ru/osiddev/app/update.zip"), "update.zip");
                    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(download_Completed);
                }
                else
                {
                    MessageBox.Show("You have newest version");
                    this.Hide();
                    Window login = new Login();
                    login.ShowDialog();
                    this.Close();
                }
    private void download_Completed(object sender, AsyncCompletedEventArgs e)
    {
        ver = ver + 1;
        Properties.Settings.Default.ver = ver;
        Process.Start("DDctD_UpTW.exe");
        Process.GetCurrentProcess().Kill();
    }

В DDctD_UpTW.exe Разархивируется архив с заменой файлов:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ionic.Zip;
using System.Diagnostics;
namespace DDctD_UpTW
{
    class Program
    {
        static void Main(string[] args)
        {
            Unzip();
        }
        public static void Unzip()
        {
            try
            {
                using (ZipFile zip = ZipFile.Read("update.zip"))
                {
                    zip.ExtractAll("/", ExtractExistingFileAction.OverwriteSilently);
                }
            }
            catch
            {
            }
            Process.Start("MainExe.exe");
            Environment.Exit(0);
        }
    }
}

Но главная проблема: После разархивации и запуска основного exe он опять пишет "New update available". Как это починить?

Answer 1

Вы не даёте вашим настройкам штатно "сохраниться" на диск убивая процесс. Уничтожение процесса через

Process.GetCurrentProcess().Kill();

вообще нехорошая практика. Правильнее сделать "штатный" выход из приложения, тогда отработает сборщик мусора и, в частности, настройки сохранятся.

Однако, сохранить настройки можно и вручную:

Properties.Settings.Default.ver = ver;
Properties.Settings.Default.Save();
Process.Start("DDctD_UpTW.exe");
Process.GetCurrentProcess().Kill();

Но, если вы так сделаете, то тоже будет "нехорошо". Если ваш DDctD_UpTW.exe не српавится с обновлением, то будет рассинхронизация между настройками и фактическим состоянием программы. Правильнее проверять версию приложения после обновления из более "надёжных" источников, чем настройки.

READ ALSO
C# Скачивание изображения из документа по url на litres.ru (Режим только чтение)

C# Скачивание изображения из документа по url на litres.ru (Режим только чтение)

Здравствуйте! Недавно столкнулся с проблемой скачивания картинки с сайта litresru

257
Как использовать progress bar если много файлов на загрузку?

Как использовать progress bar если много файлов на загрузку?

Доброй ночи, подскажите как использовать ProgressBar при загрузке множества файловУ меня всегда разный список ссылок и программа узнает об этом...

259
Как узнать какая версия nuget установлена?

Как узнать какая версия nuget установлена?

Как узнать какая версия nuget установлена? Если просто ввести:

446
Зачем в Visual C# свойство Margin?

Зачем в Visual C# свойство Margin?

Зачем в Visual C# (использую Visual Studio 2017) у элементов управления свойство margin если вне зависимости от его значения можно свободно перемещать элементы...

249