Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 8
1

Автоматическое обновление ПО без использования ClickOnce

22.11.2013, 20:03. Показов 4215. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть затруднения с кодом ниже, не получается реализовать функцию обновления у себя в программе.

Что делает Код :

1. Скачивает файлы обновления прямо с сайта.
2. Разархивирует эти файлы.
3. Заменяет старые файлы новыми.

Для использования создается файл http://mysite.ru/myprogram/update.txt на вашем сайте. В нем напишите следующие строки :

1.0.0.1
http://mysite.ru/myprogram/updater.exe.gz
http://mysite.ru/myprogram/myprogram.exe.gz

Первая строчка – номер самой свежей версии
Вторая строчка – ссылка на программу самообновления
Третья строчка и все последующие – это файлы для обновления.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Net;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using System.Diagnostics;
namespace SelfUpdate
{
static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            if (File.Exists("updater.exe")) //Проверяем на остатки от процесса обновления
            {
                System.Threading.Thread.Sleep(2000); //Спим 2 секунды, пока обновлялка закроется
                File.Delete("updater.exe"); //Удаляем обновлялку
            }
            WebClient wc = new WebClient(); //Через ВебКлиент мы скачиваем файлы
            const string updatestring = "http://mysite.ru/myprogram/update.txt"; //Это фиксированная ссылка на сайт, где лежит txt-файл с данными для обновления
            const string updatername = "updater.exe"; //Тоже фиксированное имя обновлялки
            Stream stream = null;
            try{stream = wc.OpenRead(updatestring);} //Пытаемся скачать txtшник. Он считывается не в файл, а обрабатывается прямо в памяти.
            catch{ goto normalstart; } //Если не удалось типа инет лагает, то просто грузим текущую версию проги
            StreamReader read = new StreamReader(stream); //Читалка текста в потоках
            string newversion = read.ReadLine(); //Читаем первую строчку
            string updater = read.ReadLine(); //Читаем вторую строчку
            string[] separator = { "\r\n" }; //Enter - на самом деле выглядит так =)
            string[] fileblowfiles = read.ReadToEnd().Split(separator, StringSplitOptions.RemoveEmptyEntries); //Получаем все остальные строчки разделенные Enter'ами
            read.Close(); //Закрываем потоки
            string version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); //Этот метод получает версию текущей сборки. Т.е. версию вашей программы (Допустим она 1.0.0.0)
            if (newversion != version) // Если версии не совпадают - значит прога устарела. Обновляем!
            {
                string file = updatername;
                stream = wc.OpenRead(updater); //Скачиваем и распаковываем ссылку на updater.exe
                unzip.UnZip(stream, file); stream.Close();
                foreach (string fileblowfile in fileblowfiles) //Далее просто выкачиваем все остальные файлы. Думаю необходимости проверки их доступности нет. Ведь мы уже проверили update.txt на доступность через интернет. Но можно проделать то же самое и с каждый файлом при необходимости.
                {
                    file = fileblowfile.Substring(fileblowfile.LastIndexOf('/') + 1); // превращает "http://mysite.ru/myprogram/myprogram.exe.gz" в "myprogram.exe.gz"
                    wc.DownloadFile(fileblowfile, file); //скачивает файл
                }
                wc.Dispose(); //убиваем качалку
                Process.Start(updatername); //запускаем только что распакованный updater.exe
                return; //Немедленно выходим из нашей программы
            }
            normalstart: //Метка на которую переходим, если инет не работает или упал наш сайт.
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Вот метод UnZip, который распаковывает данные из потока в файл:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.IO;
using System.IO.Compression;
namespace SelfUpdate
{
    class unzip
    {
        internal static void CopyStream(Stream from, Stream to)
        {
            byte[] buffer = new byte[1024];
            short count = -1;
            while (count != 0)
            {
                count = (short)from.Read(buffer, 0, buffer.Length);
                to.Write(buffer, 0, count);
            }
        }
        internal static void UnZip(Stream inputStream, string outputFile)
        {
            using (FileStream write = File.Create(outputFile))
            using (GZipStream unzip = new GZipStream(inputStream, CompressionMode.Decompress))
            {
                CopyStream(unzip, write);
            }
        }
    }
}

И в самой программе пишем следующий код :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Net;
using System.IO;
using System.Diagnostics;
namespace SelfUpdate
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            if (!File.Exists("myprogram.exe")) return; //Если рядом нет нашей основной проги, то возможно кто-то просто случайно её запустил))) выходим =)
            for (int i = 0; i < 5; i++) //5 раз пытаемся удалить основной файл
            {
                System.Threading.Thread.Sleep(2000); //Спим 2 секунды.
                try
                { File.Delete("myprogram.exe"); break; } //Попытка удалить файл.
                catch
                { ; }
            }
            string[] files = Directory.GetFiles(Environment.CurrentDirectory, "*.gz", SearchOption.TopDirectoryOnly); //Получаем все файлы в текущей папке с расширением ".gz"
            foreach (string file in files) //Для каждого такого файла делаем...
            {
                Stream stream = File.OpenRead(file); //Открываем файл для чтения
                unzip.UnZip(stream, Path.ChangeExtension(file, null)); //Распаковываем в файл с таким же именем, только убираем расширение ".gz"
                stream.Close(); File.Delete(file); //Закрываем поток и удаляем уже ненужный архив.
            } //После того как все архивы распаковали. В том числе и основной файл, то...
            Process.Start("myprogram.exe"); //Запускаем уже новую версию нашей основной программы.
        }
    }
}
Как понимаю первый кусок кода должен распологаться в моей программе (myprogram.exe) в Program.cs
Второй отдельно создаю в (myprogram.exe и в updater.exe) UnZip.сs - с этим проблем нету.
Третий кусок кода уже должен быть в updater.exe

Делал по такому принципу и не получилось. Увы.
Помогите в реализации этой функции.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2013, 20:03
Ответы с готовыми решениями:

Как сделать автоматическое обновление страницы без перезагрузки?
Здраствуйте гуру програмирования у меня к Вам вопрос? как зделать автоматическое оновление...

Автоматическое обновление ресурсов при смене языка без перезапуска
Юзаю MultilingualAppToolkit, у меня строки в файлах resx. Применяю вот так как в мануалах:...

Как сделать обновление версии (ClickOnce)
И так здравствуйте,ребят выручайте, 1.Создал я windows form 2.Всё что нужно там сделал ( я делал...

Автоматическое обновление
У меня стоит Автоматическое обновление на пункте включено. А выбрать что-либо иное...

3
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
22.11.2013, 22:18 2
Я бы реализовал загрузчик, который запускает главную сборку программы, перед этим проверив обновления и обновив при необходимости. А юзеру бы предложил думать, что загрузчик и есть программа, а остальное - её рабочие сборки.
0
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 8
22.11.2013, 22:22  [ТС] 3
Ну ладно он будет загружать основную программу, а проверять обновления по какому принципу будет? как он определит версию программы, когда новая выйдет.

По моему изложенный тут вариант как раз выполняет задачу по обновлению, и пользователь даже не заметит как произойдет обнова самой программы.
0
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
23.11.2013, 10:14 4
Да по тому же принципу и будет.
Посмотрит версию установленного, проверит версию на сайте.
0
23.11.2013, 10:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2013, 10:14
Помогаю со студенческими работами здесь

Автоматическое обновление!
Не удается обновиться с Автоматического обновления! Пишет что - Ваш ЦП не поддерживает WINDOWS...

Автоматическое обновление W 8
Windows 8 pro производит поиск обновлений только в ручном режиме, при этом включено автоматическое...

Автоматическое обновление
Здравствуйте. Имеется код: label3.Text = Convert.ToString(dataGridView1.Rows.Count - 1); В лабел...

Автоматическое обновление БД
Всем доброго времени суток. У меня такой вопрос ко всем знающим. Хочу написать приложение в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru