Я пытался создать автообновление своей программы через 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 не српавится с обновлением, то будет рассинхронизация между настройками и фактическим состоянием программы. Правильнее проверять версию приложения после обновления из более "надёжных" источников, чем настройки.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости