Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Обновление программы через сеть  [new]
delphinub
Member

Откуда:
Сообщений: 2
Добрый день!
Прошу помощи в решении проблемы. Реализовываю загрузку обновлений через интернет.
В данный момент пользуюсь этой функцией

function GetInetFile(const fileURL, FileName: String): boolean;
var
  hSession, hURL: HInternet;
  Buffer: array[1..1024] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: String;
begin
  Result:=false;
  sAppName:=ExtractFileName(Application.ExeName);
  hSession:=InternetOpen(PChar(sAppName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  try
    hURL:=InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      AssignFile(f,FileName);
      ReWrite(f,1);
      repeat
        InternetReadFile(hURL,@Buffer,SizeOf(Buffer),BufferLen);
        BlockWrite(f,Buffer,BufferLen);
        Vers.ProgressBar1.Position:=Vers.ProgressBar1.Position+BufferLen;
        Application.ProcessMessages;
      until
        BufferLen = 0;
      CloseFile(f);
      Result:=True;
    finally
      InternetCloseHandle(hURL);
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;


и качаю

if GetInetFile('http://tcprog.mcdir.ru/myprogram.exe',ExtractFilePath(Application.ExeName)+'/myprogram.exe') = true then
.....


так вот проблема в том, что файл качается старый. не обновленный. на сколько я могу судить ин берет его из кэша. Как только не пытался исправить, смотрел флаги запрета использовать кэш - ничего не помогает

Подскажите пожалуйста, как исправить этот код чтобы файл скачивался с сервера последний. Или, может быть, подскажите другую функцию.
Заранее благодарю
5 июл 18, 11:12    [21545232]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24160
Сервер выставляет Cache-Control?

П.С. Можно еще генерить уникальный параметр ссылки что-то вроде ?123123
5 июл 18, 11:22    [21545271]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6034
delphinub,

Используй DeleteUrlCacheEntry() перед загрузкой...
5 июл 18, 11:22    [21545272]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29045

и не ходи по http

Posted via ActualForum NNTP Server 1.5

5 июл 18, 11:31    [21545313]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45696

wadman
Сервер выставляет Cache-Control?

Ещё лучше спросить выставляет ли сервер корректный Last-Modified-Time, поскольку кэши
делают тоже не дураки и проверяют обновление файла на сервере.

Posted via ActualForum NNTP Server 1.5

5 июл 18, 12:03    [21545456]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
А я делал через репликацию БД.
И софт и доки и данные (структуры)
5 июл 18, 12:06    [21545467]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
delphinub
Member

Откуда:
Сообщений: 2
Мимопроходящий,
а через что? долго мучайся не мог понять как это работает. В итоге взял просто хостинг на макхост и качаю с него файлы
5 июл 18, 13:36    [21545912]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29045

05.07.2018 13:36, delphinub пишет:
> а через что?

httpS

Posted via ActualForum NNTP Server 1.5

5 июл 18, 13:38    [21545917]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
mvb
Member

Откуда: Казань
Сообщений: 1374
delphinub
hURL:=InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);


попробуй:
hURL:= InternetOpenUrl(hSession, PChar(fileURL), nil, 0, INTERNET_FLAG_RELOAD, 0);
5 июл 18, 22:06    [21547533]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
delphinub
смотрел флаги запрета использовать кэш - ничего не помогает

Не вижу я этих флагов в приведенном коде.
Как минимум должны быть в твоем случае INTERNET_FLAG_NO_CACHE_WRITE и INTERNET_FLAG_PRAGMA_NOCACHE.

И еще. Ты зря не любишь анализировать результат функций.
5 июл 18, 22:25    [21547571]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
YuRock
INTERNET_FLAG_NO_CACHE_WRITE и INTERNET_FLAG_PRAGMA_NOCACHE
Да, и reload, выше сказали.
5 июл 18, 22:28    [21547575]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
miksoft
Member

Откуда:
Сообщений: 36922
delphinub
'http://tcprog.mcdir.ru/myprogram.exe'
Можно заменить на такой урл:
'http://tcprog.mcdir.ru/myprogram.exe?rnd=1234567890'
где вместо цифр - любая строка из случайных латинских букв и цифр.
5 июл 18, 22:33    [21547585]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10492
miksoft
Можно заменить на такой урл:
'http://tcprog.mcdir.ru/myprogram.exe?rnd=1234567890'

Dimitry Sibiryakov
Ещё лучше спросить выставляет ли сервер корректный Last-Modified-Time, поскольку кэши делают тоже не дураки и проверяют обновление файла на сервере.
6 июл 18, 13:18    [21549240]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
miksoft
Member

Откуда:
Сообщений: 36922
_Vasilisk_
miksoft
Можно заменить на такой урл:
'[/url][url=http://tcprog.mcdir.ru/myprogram.exe?rnd=1234567890%27]http://tcprog.mcdir.ru/myprogram.exe?rnd=1234567890'

Dimitry Sibiryakov
Ещё лучше спросить выставляет ли сервер корректный Last-Modified-Time, поскольку кэши делают тоже не дураки и проверяют обновление файла на сервере.
Одно другому не мешает. Заголовки не всегда поддаются контролю, если это чужой хостинг.
А вот URL вполне поддается.
6 июл 18, 18:11    [21550507]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1369
miksoft,

скачивать каждый раз файл, даже если он не изменился не айс
если совсем никак с заголовками, то как вариант положить рядом маленький файл с версией, хешем или еще каким то признаком что основной файл изменился
6 июл 18, 18:25    [21550537]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
miksoft
Member

Откуда:
Сообщений: 36922
Дегтярев Евгений
скачивать каждый раз файл, даже если он не изменился не айс
Если это делать с разумной периодичностью, например, раз в неделю при количестве установок в пределах сотни, то ничего страшного.
6 июл 18, 18:54    [21550627]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
Я обновлялки свои делал через Socket, для упрощения все собирал в zip-архив.

Сначала Socket серверу отправлял текущую версию, если на сервере другая, то отправлял zip через сокет и на стороне клиента разворачивал архив.

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

А так есть у мелкософта целый готовый комплекс по обновлению ПО, правда сложный по настройке
6 июл 18, 22:32    [21550958]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
defecator
Member

Откуда:
Сообщений: 38583
Wolfpack
Я обновлялки свои делал через Socket, для упрощения все собирал в zip-архив.

Сначала Socket серверу отправлял текущую версию, если на сервере другая, то отправлял zip через сокет и на стороне клиента разворачивал архив.

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


нет геморроя никакого.
То, что ты стартуешь, не является основной программой.
Это модуль-проверялка обновлений.
Она качает свежатинку и обновляет основной модуль и файлы.
А потом запускает основную программу.
6 июл 18, 22:50    [21551003]     Ответить | Цитировать Сообщить модератору
 Re: Обновление программы через сеть  [new]
wupdate
Guest
https://www.tmssoftware.com/site/wupdate.asp - а мне вот эту штуку посоветовали здесь в прошлом году. Вещь!!!
7 июл 18, 17:23    [21552282]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить