Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 158
1

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

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

Author24 — интернет-сервис помощи студентам
Нужно сделать обновление программы на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2013, 19:56
Ответы с готовыми решениями:

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

Нужно сделать блок схему для программы
var i,res:integer; m:arrayof integer; begin for i:=1 to 12 do begin write(i,' число ');...

Нужно сделать диаграмму классов для программы, пожалуйста
Type TStroka=object str:string; dlina:integer; procedure Init(s:string); procedure...

Нужно сделать 3 программы разработайть проект для считывания одномерного массива из 10 элементов
1 программа: Разработайте проект для считывания одномерного массива из 10 элементов с текстового...

11
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
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
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 158
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
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
26.05.2013, 16:01 4
Закрытый символ FIconData вот что тебе пишит. Ты уверен, что правильно всё сделал?
0
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 158
26.05.2013, 16:08  [ТС] 5
Да кстати ее убрал, а она задана была. Теперь убрал полностью.

Добавлено через 2 минуты
Это нечего не доло
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
26.05.2013, 16:27 6
Ошибка переводится так: "Нет перегруженная версия 'Get', которые могут быть вызваны эти аргументы". Думаю смысл понятен, переводил гуглом.
Попробуй поискать инфо по этой ошибке и скажи куда она кидает?
0
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 158
26.05.2013, 16:35  [ТС] 7
Гуглом то я перевел. Но них не понял.
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
26.05.2013, 17:56 8
А про это не забыл:
Delphi
1
2
3
4
idFTP1.Host:='***';
idFTP1.UserName:='***';
idFTP1.Password:='*****';
idFTP1.Connect;
?
0
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 158
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
98 / 98 / 14
Регистрация: 02.02.2013
Сообщений: 328
27.05.2013, 00:05 10
Переходи на synapse да и Indy обнови.
1
3 / 3 / 2
Регистрация: 24.05.2013
Сообщений: 158
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
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
27.05.2013, 01:11 12
А если вот эту строку архив типа занова создается (получается ломанным)
Delphi
1
ZipForge1.OpenArchive(fmcreate);
оставить все как есть но прописать не создавать новый архив, а просто открыть архив-
Delphi
1
ZipForge1.OpenArchive();
не?
0
27.05.2013, 01:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2013, 01:11
Помогаю со студенческими работами здесь

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

Как сделать обновление программы
Доброго времени суток господа. Если ошибся темой, прошу перенести. Если не актуально, прошу...

Нужно сделать запрос на обновление из разных таблиц
Пожалуйста, помогите сделать запрос на обновление. Нужно в таблице №1 рассчитать сумму,...

Как сделать проверку на обновление программы?
Я делаю лаунчер для программы и мне потребовалась функция, чтоб при включении программы происходила...


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

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