Правильна реалізація поновлення програми - stack overflow російською

Поставив таке запитання, як реалізація автообновления програми. Принцип такий: користувач запускає програму, далі працює наша програма - якщо версія даної програми, наприклад 1.0. а вже є 1.1. то програма викачує нову версію і перезапускає програму, в результаті програма свіжа.

Як думаю я: На сервері лежить файл version.txt (я думаю, можна і XML, хоча буде складніше обробляти). Наша програма при кожному її запуску перевіряє версію. Читаємо файл version.txt за допомогою засобів c ++ (якщо це можливо, НЕ завантажуючи файл) і порівнюємо його з поточною версією (звичайна змінна). Якщо версії однакові, то продовжуємо роботу програми. Інакше - а тут багато варіантів, можемо пропонувати завантажувати, можемо змусити. Я виберу примусову завантаження, тобто обов'язково, або стара програма працювати не буде. Викачуємо останню версію програми і перезапускаємо її.

Запропонуйте свої варіанти. Можливо в моєму алгоритмі є і недоліки. Скажіть як краще на вашу.

P.S. Цікавить тільки алгоритм, рішення і засоби пропонуйте за бажанням.

Чи не претендую на правильність рішення, просто розповім, як це зроблено у мене. При запуску програми раз на 4 дні (частіше немає сенсу, я не випускаю нові версії так часто) у фоновому потоці запускається перевірка поновлення (користувач може і вручну запустити).

На сервері лежать такі файліки.

Програма звертається на сервер до спеціального скрипту, повідомляє свою версію, назву компонента (у мене кілька компонентів, які оновлюються окремо), і скрипт повертає потрібний xml. Йде порівняння по TimeStamp з локальною версією цього файлу і програма показує користувачу пропозицію оновитися з описом змін в новій версії.

Якщо користувач погоджується, програма перезапускає сама себе з правами адміністратора, і викачує файл за вказаною DownloadUrl. Перевіряє md5 хеш zip архіву і розпаковує архів у тимчасову папку. Всередині архіву є ще один xml файл, де вказано, в які папки потрібно розкидати файли. Перед перезаписом exe і dll файлів вони перейменовуються в * .old. Після чого програма запускає нову версію з особливим ключем, щоб можна було виконати ще які небудь дії (як правило, не требутся).

Деякі компоненти (що не містять exe файли) оновлюються нишком без відома користувача.

При моєму підході є недоліки, при деінсталяції інсталятором (InnoSetup), нові файли, встановлені за допомогою авто-оновлення будуть збережені.

Хоча напевно для поновлення exe правильніше було б завантажувати інсталятор і встановлювати його по-тихому, але мені лінь переробляти. Мені подобається, як зроблено оновлення у браузерів (гугл хром і т.д.), програма оновлюється сама, а користувач навіть не помічає. Але заради цього програма встановлена ​​в папку користувача, а не в Program Files. Причому, якщо не помиляюся, у гугла інкрементне оновлення, тобто замість величезного бінарники на 100 мб скачується невеликий diff.

Але відмовлятися від вбудованої системи поновлення я не бачу сенсу, моя програма (Image Uploader) повинна часто оновлювати підтримку хостингів, які часто змінюються, це життєва необхідність. Оновлення хостингів важить грубо кажучи 50 кб, а сама програма 5 МБ.

P.S. Забороняти користувачам користуватися старими версіями програми - нерозумно. Я намагаюся підтримувати зворотну сумісність зі старими версіями до розумної межі.

Схожі статті