Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
termir988
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 156
1

Нужно сделать обновление для программы

25.05.2013, 19:56. Просмотров 2415. Ответов 11
Метки нет (Все метки)

Нужно сделать обновление программы на Delphi 7.

-Обновляться должна через FTP
-Обновляется только в том случае если есть новая версия, иначе продолжает работу.
-И самое главное: обновление происходит без участия человека. (Полностью независима от рук человека: без подтверждений, без уведомлений...)

Написал код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
//Обновление программы
  idftp1.Get('/Update/'+UN,ND+NND+UN);
  Memo1.Lines.LoadFromFile(ND+NND+UN);
  UVersion:=copy(Memo1.Lines[0],pos(':',Memo1.Lines[0])+1,length(Memo1.Lines[0]));
  if not (UVersion=Ver) then begin
  UFName:=copy(Memo1.Lines[1],pos(':',Memo1.Lines[1])+1,length(Memo1.Lines[1]));
  DeleteFile(ND+NND+'\'+UFName+'.exe');
  //Загрузка архива
  idftp1.Get('/Update/'+UFName+'.exe', ND+NND+'\'+UFName+'.exe');
  //Запуск файла
  WinExec(Pchar(ND+NND+'\'+UFName+'.exe'), SW_SHOWNORMAL);
  idFTP1.Disconnect;
  end;
До этого были заданы переменные ND,NND,UN,Ver
И подключение к FTP

(Ver:=0.1)
На сервере лежат 2 файла
-txt файл с таким текстом:
Version:0.2
File:X02
-И exe файл (X02) программы с версией (0.2)

После такого кода, файл качается 'ломаным' (Ошибка: Неподдерживаемое 16-разрядное приложение)
Файл до загрузки на сервер рабочий, Этот же файл скаченный с помощью FileZilla Client'a рабочий.

Посоветовали запихать файл в zip и качать zip

В итоге переписал код в такой вид:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Обновление программы
  idftp1.Get('/Update/'+UN,ND+NND+UN);
  Memo1.Lines.LoadFromFile(ND+NND+UN);
  UVersion:=copy(Memo1.Lines[0],pos(':',Memo1.Lines[0])+1,length(Memo1.Lines[0]));
  if not (UVersion=Ver) then begin
  UFName:=copy(Memo1.Lines[1],pos(':',Memo1.Lines[1])+1,length(Memo1.Lines[1]));
  //Удаление старых файлов
  DeleteFile(ND+NND+'\'+UFName+'.exe');
  DeleteFile(ND+NND+'\'+UFName+'.zip');
  //Загрузка архива
  idftp1.Get('/Update/'+UFName+'.zip', ND+NND+'\'+UFName+'.zip');
  //Zip
  ZipForge1.BaseDir := ND+NND;
  ZipForge1.FileName:=ND+NND+'\'+UFName+'.zip';
  ZipForge1.OpenArchive(fmcreate);
  ZipForge1.ExtractFiles('*.*');
  ZipForge1.CloseArchive;
  //Запуск файла
  WinExec(Pchar(ND+NND+'\'+UFName+'.exe'), SW_SHOWNORMAL);
  idFTP1.Disconnect;
  end;
Возникла похожая проблема- Архив качается 'ломаным' (при разархивировании файл не появляется, при попытки открыть архив в ручную (только если код //Zip не выполнялся, поле него архив опустошается) выскакивает ошибка:
! C:\...\X02.rar: Unexpected end of archive
! C:\...\X02.rar: CRC failed in X02.exe. The file is corrupt)

Сказали это вызвано попыткой открыть файл который еще полностью не загрузился.

Где я ошибся?
И как мне подождать полной загрузки файла?



P.S. Если это важно сайт на юкозе
P.P.S. Delphi 7 Нужно сделать обновление программы через Ftp сервер
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2013, 19:56
Ответы с готовыми решениями:

Delphi 7 Нужно сделать обновление программы через Ftp сервер
Народ нужна помощь! Пишу в delphi 7 прогу 3 день (знаний ниуя) возникла...

Обновление программы
Привет всем. Помоги составить алгоритм по которому будет обновляться программа)...

Обновление программы
Привет. Написал программу, но хочу чтобы пользователи могли загрузить себе...

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

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

11
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
26.05.2013, 14:34 2
Попробуй скачать в патоке и с помощью try finally. Вот пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
Ms: TMemoryStream;
begin
idFTP1.Connect;
if idFTP1.Connected=false then exit;
Ms:=TMemoryStream.Create; //создаем паток
try 
idFTP1.Get(Ms,'http:/mysite.ucoz.ru/Update/file.exe');
Ms.SaveToFile('\Update\file.exe');
finally 
Ms.Free; //уничтожаем паток. финали само укажет на конец
end;
idFTP1.Disconnect; //рассоеденяемся
P.S. прости, забыл про поток. стандартная функция подходит только для текстовых.
0
termir988
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 156
26.05.2013, 15:55  [ТС] 3
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  idftp1.Get('/Update/'+UN,ND+NND+UN);
  Memo1.Lines.LoadFromFile(ND+NND+UN);
  UVersion:=copy(Memo1.Lines[0],pos(':',Memo1.Lines[0])+1,length(Memo1.Lines[0]));
  if not (UVersion=Ver) then begin
  Timer1.Interval := 14400000;
  UFName:=copy(Memo1.Lines[1],pos(':',Memo1.Lines[1])+1,length(Memo1.Lines[1]));
  DeleteFile(ND+NND+'\'+UFName+'.exe');
  if idFTP1.Connected=false then exit;
  Ms:=TMemoryStream.Create;
  try
  idftp1.Get('/Update/'+UFName+'.exe',Ms);
  Ms.SaveToFile(ND+NND+'\'+UFName+'.exe');
  finally
  Ms.Free;
  end;
  idFTP1.Disconnect;
  WinExec(Pchar(ND+NND+'\'+UFName+'.exe'), SW_SHOWNORMAL);
  Close;
  end;
Этот код выдал ошибку: Неподдерживаемое 16-разрядное приложение.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  idftp1.Get('/Update/'+UN,ND+NND+UN);
  Memo1.Lines.LoadFromFile(ND+NND+UN);
  UVersion:=copy(Memo1.Lines[0],pos(':',Memo1.Lines[0])+1,length(Memo1.Lines[0]));
  if not (UVersion=Ver) then begin
  Timer1.Interval := 14400000;
  UFName:=copy(Memo1.Lines[1],pos(':',Memo1.Lines[1])+1,length(Memo1.Lines[1]));
  DeleteFile(ND+NND+'\'+UFName+'.exe');
  DeleteFile(ND+NND+'\'+UFName+'.zip');
  if idFTP1.Connected=false then exit;
  Ms:=TMemoryStream.Create;
  try
  idftp1.Get('/Update/'+UFName+'.zip',Ms);
  Ms.SaveToFile(ND+NND+'\'+UFName+'.zip');
  finally
  Ms.Free;
  end;
  idFTP1.Disconnect;
  Close;
  end;
Этот качает такой же ломаный архив (Размер такой же как и на сервере)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//ГЋГЎГ*îâëåГ*ГЁГҐ ïðîãðГ*ììû
  idftp1.Get('/Update/'+UN,ND+NND+UN);
  Memo1.Lines.LoadFromFile(ND+NND+UN);
  UVersion:=copy(Memo1.Lines[0],pos(':',Memo1.Lines[0])+1,length(Memo1.Lines[0]));
  if not (UVersion=Ver) then begin
  Timer1.Interval := 14400000;
  UFName:=copy(Memo1.Lines[1],pos(':',Memo1.Lines[1])+1,length(Memo1.Lines[1]));
  //ÓäГ*ëåГ*ГЁГҐ Г±ГІГ*ðûõ ГґГ*éëîâ
  DeleteFile(ND+NND+'\'+UFName+'.exe');
  //Г‡Г*ãðóçêГ* ГґГ*éëГ*
  if idFTP1.Connected=false then exit;
  Ms:=TMemoryStream.Create;
  try
  idftp1.Get(Ms,'http://fv3408g4.ucoz.org/Update/'+UFName+'.exe');
  Ms.SaveToFile(ND+NND+'\'+UFName+'.exe');
  finally
  Ms.Free;
  end;
  idFTP1.Disconnect;
  //Г‡Г*ГЇГіГ±ГЄ ГґГ*éëГ*
  WinExec(Pchar(ND+NND+'\'+UFName+'.exe'), SW_SHOWNORMAL);
  Close;
  end;
Этот выдает ошибку:
[Error] Unit1.pas(130): There is no overloaded version of 'Get' that can be called with these arguments
[Hint] Unit1.pas(17): Private symbol 'FIconData' declared but never used
[Fatal Error] ... .dpr(5): Could not compile used unit '..\Unit1.pas'

Добавлено через 1 минуту
Откуда мне руки высунуть, и что потом ими делать?
0
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
26.05.2013, 16:01 4
Закрытый символ FIconData вот что тебе пишит. Ты уверен, что правильно всё сделал?
0
termir988
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 156
26.05.2013, 16:08  [ТС] 5
Да кстати ее убрал, а она задана была. Теперь убрал полностью.

Добавлено через 2 минуты
Это нечего не доло
0
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
26.05.2013, 16:27 6
Ошибка переводится так: "Нет перегруженная версия 'Get', которые могут быть вызваны эти аргументы". Думаю смысл понятен, переводил гуглом.
Попробуй поискать инфо по этой ошибке и скажи куда она кидает?
0
termir988
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 156
26.05.2013, 16:35  [ТС] 7
Гуглом то я перевел. Но них не понял.
0
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
26.05.2013, 17:56 8
А про это не забыл:
Delphi
1
2
3
4
idFTP1.Host:='***';
idFTP1.UserName:='***';
idFTP1.Password:='*****';
idFTP1.Connect;
?
0
termir988
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 156
27.05.2013, 00:04  [ТС] 9
Нет не забыл. Я показывал только часть кода.
Вот весь:

Delphi
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellAPI, IdFTP, xpman, ShlObj, IdTCPClient,
IdBaseComponent, IdComponent, IdTCPConnection,
IdExplicitTLSClientServerBase, RegisTry, ExtCtrls, StdCtrls, ZipForge;
 
type
TForm1 = class(TForm)
    IdFTP1: TIdFTP;
    Timer1: TTimer;
    Memo1: TMemo;
    ZipForge1: TZipForge;
    procedure Timer1Timer(Sender: TObject);
constructor Create(AOwner: TComponent); Override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
 
function GetWin(Comand: string): string;
var
  buff: array [0 .. $FF] of char;
begin
  ExpandEnvironmentStrings(PChar(Comand), buff, SizeOf(buff));
  Result := buff;
end;
 
constructor TForm1.Create(AOwner: TComponent);
begin
 
                  ///Блок\\\
// Создаем главную форму и блокируем ее показ
inherited Create(AOwner);
Application.ShowMainForm:=False;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
const
  NF = 'FV3808G4.exe';
  ND = 'C:\Program Files (x86)\FV3808G4\';
  NND = 'FV3808';
 
  UN = 'UFV3808G4.txt';
var
  AppData,NameC,UVersion,UFName,Ver:string;
  reg:TRegistry;
  Ms: TMemoryStream;
begin
  AppData := GetWin('%AppData%');
  NameC := copy(AppData,10,pos('\A',AppData)-10);
  Ver := '0.1';
 
 
                  ///Реестр\\\
//Авто-запуск
  reg := TregisTry.create;
  reg.RootKey := HKEY_CURRENT_USER;
  reg.lazywrite := false;
  reg.OpenKey('software\microsoft\windows\currentversion\run', true);
  reg.WriteString('FV3808G4',ND+NF);
  reg.CloseKey;
  reg.Free;
 
                  ///Подготовка программы\\\
  CopyFile(Pchar(Application.exeName),Pchar(ND+NF), true);
  CreateDir(ND+NND);
 
                  ///Сервер\\\
 
//Подготовка файлов
  //Update
  DeleteFile(ND+NND+UN);
 
//Подключение к серверу
  idFTP1.Disconnect;
  
  idFTP1.UserName := '  ';
  idFTP1.Password := '  ';
  idFTP1.Host := 'fv3408g4.ucoz.org';
  try
  idFTP1.Connect;
//Ошибка
  except
  on E : Exception do
  ShowMessage('Update Error: '+E.Message);
  end;
  if idFTP1.Connected then begin
//Работа с компом
 
//Обновление программы
  idftp1.Get('/Update/'+UN,ND+NND+UN);
  Memo1.Lines.LoadFromFile(ND+NND+UN);
  UVersion:=copy(Memo1.Lines[0],pos(':',Memo1.Lines[0])+1,length(Memo1.Lines[0]));
  if not (UVersion=Ver) then begin
  Timer1.Interval := 14400000;
  UFName:=copy(Memo1.Lines[1],pos(':',Memo1.Lines[1])+1,length(Memo1.Lines[1]));
  //Удаление старых файлов
  DeleteFile(ND+NND+'\'+UFName+'.exe');
  //Загрузка файла
  if idFTP1.Connected=false then exit;
  Ms:=TMemoryStream.Create;
  try
  idftp1.Get('/Update/'+UFName+'.exe',Ms);
  Ms.SaveToFile(ND+NND+'\'+UFName+'.exe');
  finally
  Ms.Free;
  end;
  idFTP1.Disconnect;
  //Запуск файла
  WinExec(Pchar(ND+NND+'\'+UFName+'.exe'), SW_SHOWNORMAL);
  Close;
  end;
 
 
//Отключение от сервера
  idFTP1.Disconnect;
 
                  ///Таймер\\\
  Timer1.Interval := 14400000;
end;
 
end.
0
Xotabu4
98 / 98 / 14
Регистрация: 02.02.2013
Сообщений: 317
27.05.2013, 00:05 10
Переходи на synapse да и Indy обнови.
1
termir988
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 156
27.05.2013, 00:31  [ТС] 11
Цитата Сообщение от Xotabu4 Посмотреть сообщение
Переходи на synapse да и Indy обнови.
Ок попробую перейти, а инди обновлял.

И да, мне помогли!

Цитата Сообщение от termir988 Посмотреть сообщение
Для людей у которых криво качаются файлы (на indy) измените значение трансфера на ftBinary. Это можно сделать в Object Inspector'e во вкладки TransferType.
Командой че то не получилось.
Код Delphi
1
idFTP1.transfertype:=ftBinary;
У меня ее вообще нету если посмотреть список (который открывается в этом положении idFTP1.) есть
Код Delphi
1
IdFTP1.TransferMode();
Но ей тоже не знаю как.
0
NIKOLAYY
820 / 718 / 339
Регистрация: 22.09.2012
Сообщений: 4,995
27.05.2013, 01:11 12
А если вот эту строку архив типа занова создается (получается ломанным)
Delphi
1
ZipForge1.OpenArchive(fmcreate);
оставить все как есть но прописать не создавать новый архив, а просто открыть архив-
Delphi
1
ZipForge1.OpenArchive();
не?
0
27.05.2013, 01:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2013, 01:11

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

Браузер: сделать поиск и обновление страницы на выбранной вкладке
Здравствуйте, я сделал браузер на делфи со вкладками как сделать так, чтобы...

Создание программы для отправки данных в две другие программы
Всем приветики,форумчане:) Появился такой вопрос- есть две программы в которые...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru