purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 10:44 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Автообновление программы
СообщениеДобавлено: Пн дек 30, 2013 8:28 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Наверное, многим хотелось бы сделать updater для своей программы. Я нашёл у себя код, как-то делал кому-то, довёл до ума. И выкладываю тут.
Предположим, наша программа находится на сайте http://site.ru/program/. В таком случае, мы помещаем в корень данной папки файл files.lst (т.е. http://site.ru/program/files.lst), там же находятся и файлы программы. Нашу программу (назовём её updater.exe) помещаем в корень папки нашей программы.
Структура файла files.lst:
Код:
1
2
3
4
5
[DIRECTORY]
   Список папок
[/DIRECTORY]
Имя файла 1|Размер в байтах|MD5
Имя файла 2|Размер в байтах|MD5

В первой части список всех папок (каждая папка на новой строке). Если указанной папки не будет найдено на вашем компьютере, она будет создана.
Вторая часть - список файлов (включая путь относительно корня папки программы). Если либо размер либо хеш не совпадает, файл скачается заново.
Например, у нас есть программа
Код:
1
2
3
4
5
6
7
8
folder1/
folder2/
   1.txt
   2.exe
   f3/
      23.ini
prog.exe
updater.exe


Тогда files.lst будет выглядить так:
Код:
1
2
3
4
5
6
7
8
9
10
[DIRECTORY]
folder1
folder2
folder2/f3
[/DIRECTORY]
folder2/1.txt|...
folder2/2.exe|...
folder2/f3/23.ini|...
prog.exe|...
updater.exe|...

Ну и сам код:
Код:
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Global NewList BadFiles$() ;Создаём динамический список для файлов, которые надо заменить
Global Directory = 0
Global InetFile$ = "http://site.ru/program/files.lst" ;Файл, содержащий список файлов
Global FilesPath$ = "http://site.ru/program/" ;Путь к файлам программы
Global error = 0
 
Procedure Download(FileName$) ;Процедура скачивания файлов
  If ReceiveHTTPFile(FilesPath$ + FileName$,FileName$)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
Procedure Update() ;Процедура скачивания новых файлов
  CountFiles = ListSize(BadFiles$()) ;Получаем количество файлов, которые нужно заменить
  SetGadgetAttribute(5,#PB_ProgressBar_Maximum,CountFiles) ;Устанавливаем максимальное значение для прогрессбара
  SetGadgetText(1,"Скачивание новых файлов")
  ForEach BadFiles$() ;Начинаем перебор список старых файлов
    File$ = BadFiles$()
    If Download(file$)
    Else
      MessageRequester("Обновление", "Не удалось получить один из файлов.", #MB_OK|#MB_ICONERROR)
      error = error + 1
      Continue
    EndIf
    SetGadgetState(5,GetGadgetState(5)+1)
  Next
  End
EndProcedure
 
Procedure Start(*Value)
  If ReceiveHTTPFile(InetFile$,"files.lst") ;Получаем files.lst и сохраняем его в папке с прогой под именем files.lst
    If OpenFile(1,"files.lst") ;Открываем files.lst
      While Eof(1) = 0;Пока не прочитали весь файл
        String$ = ReadString(1) ;Читаем строки файла
        If String$ = "[DIRECTORY]"
          Directory = 1
          Continue
        ElseIf String$ = "[/DIRECTORY]"
          Directory = 0
          Continue
        EndIf
        If Directory = 1
          CreateDirectory(String$)
        Else
          Path$ = StringField(String$,1,"|") ;Получаем путь к файлу
          Size = Val(StringField(String$,2,"|")) ;Получаем размер файла
          md5$ = StringField(String$,3,"|")
          If FileSize(Path$) <> Size Or MD5FileFingerprint(Path$) <> md5$ ;Если размеры файла или хеш не совпадают
            AddElement(BadFiles$()) ;Добавляем элемент в список для файлов, которые нужно заменить
            BadFiles$() = Path$ ;Присваиваем новому элементу путь к старому файлу
            DeleteFile(Path$) ;Удаляем старый файл, так как мы будем скачивать новую версию
            SetGadgetText(1,"Удаление старых файлов...")
          Else ;Если размеры файла совпадают
            Continue ;Читаем следующую строку (переходим на следующий виток цикла)
          EndIf
        EndIf
      Wend
    Else
      MessageRequester("Обновление", "Невозможно открыть файл files.lst", #MB_OK|#MB_ICONERROR)
      End
    EndIf
  Else
    MessageRequester("Обновление", "Невозможно получить файл files.lst", #MB_OK|#MB_ICONERROR)
    End
  EndIf
  Update()
  DeleteFile("files.lst")
EndProcedure
 
If OpenWindow(0, 512, 126, 600, 129, "Обновление",#PB_Window_SystemMenu|#PB_Window_TitleBar)
  TextGadget(0, 10, 15, 50, 15, "Статус:")
  TextGadget(1, 70, 15, 275, 15, "Проверка файлов...")
  TextGadget(2, 10, 45, 55, 15, "Загрузка:")
  TextGadget(3, 75, 45, 355, 15, "")
  TextGadget(4, 450, 45, 140, 15, "")
  ButtonGadget(6, 220, 100, 130, 25, "Отмена", #PB_Button_Default)
  ProgressBarGadget(5, 10, 70, 580, 20, 0, 10)
EndIf
 
If InitNetwork() = 0 ;Создаём возможность использования сети
  MessageRequester("Обновление","Невозможно использовать сеть",#MB_ICONERROR)
  End
EndIf
 
CreateThread(@Start(), 1)
;Структура files.lst:
;Имя файла|Размер файла в байтах|MD5
Repeat
  event = WaitWindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit = 1
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 6
          Select MessageRequester("Обновление", "Вы действительно хотите прервать установку обновлений? Вы сможете в дальнейшем продолжить её.", #MB_YESNO|#MB_ICONWARNING)
            Case #IDYES
              End
            Case #IDNO
          EndSelect
      EndSelect
  EndSelect
Until quit = 1


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт дек 31, 2013 6:01 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Никита Однороб писал(а):
Наверное, многим хотелось бы сделать updater для своей программы. Я нашёл у себя код, как-то делал кому-то, довёл до ума.

Что то не особо доведено "до ума"
Если проверяется хеш, то какой смысл сверять размер файла?
Не обработана ситуация, когда файл не удаляется. Если он занят основной программой, если основная программа работает?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт дек 31, 2013 9:30 am 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Данный код предполагает завершение основной программы. Для этого в начало кода нужно добавить предупреждение "Для обновления нужно закрыть программу". И кильнуть процесс, если юзер все таки ее не закрыл

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт дек 31, 2013 10:07 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Никита Однороб писал(а):
Данный код предполагает завершение основной программы. Для этого в начало кода нужно добавить предупреждение "Для обновления нужно закрыть программу". И кильнуть процесс, если юзер все таки ее не закрыл

Это не код предполагает, а ты домыслил!
Из кода ни чего такого не видно.
Да и не обязательно файлы могут быть заняты соей программой. А если другой, там есть обычный txt, к примеру в редакторе? Или "килять" всё, что запущено на компе :D

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт дек 31, 2013 1:20 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1694
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
тоже, кстати, интересно. можно ли переписывать обновки в самом ехе, без его перезапуска и без внешнего обновлятора? :)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Сб янв 04, 2014 6:14 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 239
Благодарил (а): 32 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Нашол прекрасный способ обходится без внешнего модуля при самообновлении, не секрет, что программа не может сама удалить собственный файл (блокируется системой), но она прекрасно может его переименовать :D .
А далее все просто:
1) Скачиваем новую версию с другим именем prog.new
2) Переименовываем себя prog.exe > prog.old
3) Переименовываем prog.new > prog.exe
4) запускаем prog.exe и завершаемся
5) во время запуска проверяем наличие prog.old, если есть - удаляем.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Сб янв 04, 2014 7:08 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Kuzmat писал(а):
Нашол прекрасный способ обходится без внешнего модуля при самообновлении.

Долго искал??? А то прочитай вот эту темку
viewtopic.php?f=1&t=1598

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вс янв 05, 2014 4:34 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 239
Благодарил (а): 32 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
мдэ.. :oops: все "велосипеды" уже в гараже, а не нашол в свое время (гуглил по бескрайним просторам)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт янв 07, 2014 11:23 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
http://www.lameguard.com/lameupdater.html

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт янв 21, 2014 9:36 am 
Не в сети
доцент

Зарегистрирован: Пт мар 26, 2010 11:07 am
Сообщений: 51
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ребят, а какой сервис порекомендуете для реализации подобной фичи?
Платный хостинг с гибкими настройками и прямыми ссылками дело понятное, но вот конкретно надо обновлять одну небольшую программку и покупать для неё место неразумно...
Перепробовал все какие знал: гугл диск, яндекс диск, дропбокс, cubby - только последний выдаёт более менее прямую ссыль и не меняет её при замене файла, однако пурик отказывается с него выкачивать полностью файл, скачивает 194 байт и всё, файл конечно же не открывается, при просмотре содержит внутри себя гиперссылку на файл
использую код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
If InitNetwork() = 0
  MessageRequester("Тест","Нет сети",#MB_ICONERROR)
  End
EndIf
 
Procedure Download(FileName$)
        Debug FileName$
        Debug GetCurrentDirectory()
  If ReceiveHTTPFile(FileName$, GetCurrentDirectory()+"downloaded.jpg")
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
;http://nevseoboi.com.ua/uploads/posts/2011-02/1298928540_0015_www.nevseoboi.com.ua.jpg
If Download("https://www.cubby.com/pl/DataBaseEditor.exe/_789d53ec2a494353a5b447b218b99419")
        MessageRequester("Тест", "Файл загружен.", #MB_OK)
Else    
    MessageRequester("Тест", "Не удалось скачать файл.", #MB_OK|#MB_ICONERROR)
EndIf

закоменченная ссылка - рабочая, по ней выкачивается без проблем картинка

может в коде что-то допилить чтобы файл выкачивался?
просто в браузере то он качается без проблем ...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт янв 21, 2014 9:50 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
gabriel писал(а):
Платный хостинг с гибкими настройками и прямыми ссылками дело понятное, но вот конкретно надо обновлять одну небольшую программку и покупать для неё место неразумно...

Есть очень много бесплатных хостингов(с рекламой и без) на которых можно использовать прямые ссылки. Только необходимо чтобы трафик был.

gabriel писал(а):
https

По моему, пурик еще не умеет работать с шифрованным соединением.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт янв 21, 2014 10:12 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
gabriel писал(а):
Ребят, а какой сервис порекомендуете для реализации подобной фичи?

Испоьзую бесплатно http://www.webservis.ru/
100 мб места под сайт
почта
CGI, PHP
FTP доступ

Ссылки абсолютно прямые. По Ftp закачиваю файлы, при помощи ReceiveHTTPFile скачиваю.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Автообновление программы
СообщениеДобавлено: Вт янв 21, 2014 3:59 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
hostinger.ru (2GB на диске, 100GB Трафика, PHP/MySQL, Без Рекламы) советую. У самого на нём два сайта — никаких проблем

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB