Я пытался создать автообновление своей программы через 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"
. Как это починить?
Вы не даёте вашим настройкам штатно "сохраниться" на диск убивая процесс. Уничтожение процесса через
Process.GetCurrentProcess().Kill();
вообще нехорошая практика. Правильнее сделать "штатный" выход из приложения, тогда отработает сборщик мусора и, в частности, настройки сохранятся.
Однако, сохранить настройки можно и вручную:
Properties.Settings.Default.ver = ver;
Properties.Settings.Default.Save();
Process.Start("DDctD_UpTW.exe");
Process.GetCurrentProcess().Kill();
Но, если вы так сделаете, то тоже будет "нехорошо". Если ваш DDctD_UpTW.exe
не српавится с обновлением, то будет рассинхронизация между настройками и фактическим состоянием программы. Правильнее проверять версию приложения после обновления из более "надёжных" источников, чем настройки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте! Недавно столкнулся с проблемой скачивания картинки с сайта litresru
Доброй ночи, подскажите как использовать ProgressBar при загрузке множества файловУ меня всегда разный список ссылок и программа узнает об этом...
Как узнать какая версия nuget установлена? Если просто ввести:
Зачем в Visual C# (использую Visual Studio 2017) у элементов управления свойство margin если вне зависимости от его значения можно свободно перемещать элементы...