end;
//下载升级文件
btn_next.Enabled := false;
btn_next.Caption := '正下载文件..';
button2.Enabled := true;
try
AppIni := TIniFile.Create(g_path + 'update\update.ini');
for i := 0 to files.Count - 1 do
begin
ListView_files.Items[i].StateIndex := 0;
ListView_files.Items[i].ImageIndex := 0;
listview_files.Items[i].SubItems.Add(appini.ReadString(files[i], 'datetime', ''));
host1 := Edt_url.Text + files[i];
file1 := g_path + 'update\' + files[i];
memo1.Lines.Add('连接远程文件:' + host1 + #13#10);
if getfiledate(files[i], fd) then
begin
if fd < strtodatetime(Appini.ReadString(files[i], 'datetime', '')) then
begin
listview_files.Items[i].SubItems.Append('需要升级');
if Download(host1, file1) then
begin
allget:=true;
ListView_files.Items[i].StateIndex := 1;
ListView_files.Items[i].ImageIndex := 1;
end
else
begin
allget:=false;
ListView_files.Items[i].StateIndex := 2;
ListView_files.Items[i].ImageIndex := 2;
end;
end
else
begin
allget:=true;
listview_files.Items[i].SubItems.Append('不需更新');
ListView_files.Items[i].StateIndex := 3;
ListView_files.Items[i].ImageIndex := 3;
memo1.Lines.Add(listview_files.Items[i].Caption+'文件不需要更新,跳过下载'+#13#10);
end;
end
else
begin
listview_files.Items[i].SubItems.Append('需要创建');
if Download(host1, file1) then
begin
allget:=true;
ListView_files.Items[i].StateIndex := 1;
ListView_files.Items[i].ImageIndex := 1;
end
else
begin
allget:=false;
ListView_files.Items[i].StateIndex := 2;
ListView_files.Items[i].ImageIndex := 2;
end;
end;
end;
finally
button2.Enabled := false;
AppIni.Free;
HTTPfiles.Disconnect;
end;
btn_next.Enabled := true;
sj:=sj or allget;
if (Notebook_step.PageIndex = Notebook_step.Pages.Count - 1) and sj then btn_next.Caption := '完成升级' else btn_next.Caption:='继续下载';
end;
end;
procedure TForm_Update.Notebook_stepPageChanged(Sender: TObject);
begin
if Notebook_step.PageIndex = 0 then
begin
btn_pre.Enabled := false;
btn_next.Caption := '下一步';
btn_next.Enabled := true;
end
else btn_pre.Enabled := true;
end;
procedure TForm_Update.ListBox_serversClick(Sender: TObject);
var i: integer;
begin
Edt_url.Text := '';
for i := 0 to ListBox_servers.Items.Count - 1 do
if ListBox_servers.Selected[i] then
begin
try
AppIni := TIniFile.Create(g_path + '\chis.ini');
Edt_url.Text := AppIni.ReadString('update', ListBox_servers.Items[i], 'http://');
finally
AppIni.Free;
end;
end;
end;
procedure TForm_Update.FormShow(Sender: TObject);
begin
btn_next.SetFocus;
end;
procedure TForm_Update.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
try
HTTPFiles.Disconnect;
except
end;
files.Free;
end;
function TForm_Update.ExistNewFile: Boolean;
var i {, iFileHandle}: integer;
{FileDateTime: TDateTime;}
filestr: TStringList;
begin
result := false;
filestr := TStringList.Create;
//下载文件
files.Clear;
try
if copy(Edt_url.Text, length(Edt_url.Text), 1) <> '/' then Edt_url.Text := Edt_url.Text + '/';
filestr.Add(HTTPFiles.Get(Edt_url.Text + sys_id + '.htm'));
filestr.SaveToFile(g_path + 'update\update.ini');
filestr.Free;
except
MessageBox(handle, '取得升级信息出错!', '错误提示', MB_OK + MB_ICONERROR);
exit;
end;
files.Clear;
try
AppIni := TIniFile.Create(g_path + '\update\update.ini');
AppIni.ReadSections(files);
{for i := 0 to files.Count - 1 do //逐个文件进行判断是否需要更新
try
iFileHandle := FileOpen(g_path + files[i], fmOpenRead);
FileDateTime := FileDateToDateTime(FileGetDate(iFileHandle));
FileClose(iFileHandle);
listview_files.Items[i].SubItems.Add(appini.ReadString(files[i], 'datetime', ''));
if FileDateTime < strtodatetime(Appini.ReadString(files[i], 'datetime', '')) then
// begin
// result := true;
// break;
listview_files.Items[i].SubItems.Add('是')
else
listview_files.Items[i].SubItems.Add('否');
// end;
except
end;}
finally
AppIni.Free;
end;
result := true;
end;
procedure TForm_Update.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := true;
if HTTPFiles.Connected then
begin
if MessageBox(handle, '正在下载文件,要退出吗?', '信息提示', MB_YESNO + MB_ICONQUESTION) = ID_YES then CanClose := true else CanClose := false;
end;
if btn_next.Caption = '完成升级' then
begin
if MessageBox(handle, '文件下载已经完成,但并没有更新文件,要退出吗?', '信息提示', MB_YESNO + MB_ICONQUESTION) = ID_YES then CanClose := true else CanClose := false;
end;
end;
procedure TForm_Update.Button1Click(Sender: TObject);
begin
if self.Height = 280 then self.Height := 438 else self.Height := 280;
end;
if ExistNewFile then //如果存在升级信息
begin
ListView_files.Items.Clear;
Gauge_process.Progress := 0;
for i := 0 to files.Count - 1 do
begin
Flist := ListView_files.Items.Add; //把待升级文件信息写入列表
Flist.Caption := files[i];
Flist.StateIndex := -1;
Flist.ImageIndex := -1;
function getfiledate(const filename2: string; var d: TDateTime): Boolean;
var
DosFileTime: integer;
begin
result := false;
DosFileTime := FileAge(filename2);
if DosFileTime <> -1 then //返回-1表示文件不存在
begin
d := FileDateToDateTime(DosFileTime);
result := true;
end;
end;
function socket_rec_line1(socket1: TCustomWinSocket; timeout1: integer; crlf1: string = #13#10): string;
var
buf1: Tbuf_char;
r1: integer;
ts1: TStringStream; //保存所有的数据
FSocketStream: TWinSocketStream;
begin
ts1 := TStringStream.Create('');
FSocketStream := TWinSocketStream.create(Socket1, timeout1);
//while true do//下面的一句更安全,不过对本程序好象没起作用
while (socket1.Connected = true) do
begin
//确定是否可以接收数据
//只能确定接收的超时,可见WaitForData的源码
if not FSocketStream.WaitForData(timeout1) then break; //continue;
//这一句是一定要有的,以免返回的数据不正确
zeromemory(@buf1, sizeof(buf1));
r1 := FsocketStream.Read(buf1, 1); //每次只读一个字符,以免读入了命令外的数据
//读不出数据时也要跳出,要不会死循环
if r1 = 0 then break; //test
//用FsocketStream.Read能设置超时
//r1:=socket1.ReceiveBuf(buf1,sizeof(buf1));
ts1.Write(buf1, r1);
//读到回车换行符了
if pos(crlf1, ts1.DataString) <> 0 then
begin
break;
end;
end;
result := ts1.DataString;
//没有读到回车换行符,就表示有超时错,这时返回空字符串
if pos(crlf1, result) = 0 then
begin
result := '';
end;
ts1.Free;
FSocketStream.Free;
end;
function get_host1(in1: string): string;
begin
in1 := trim(in1);
if pos('http://', lowercase(in1)) = 1 then
begin
in1 := copy(in1, length('http://') + 1, length(in1));
end;
if pos('/', in1) <> 0 then
begin
in1 := copy(in1, 0, pos('/', in1) - 1);
end;
result := in1;
end;
function get_file1(in1: string): string;
begin
in1 := trim(in1);
if pos('http://', lowercase(in1)) = 1 then
begin
in1 := copy(in1, length('http://') + 1, length(in1));
end;
if pos('/', in1) <> 0 then
begin
in1 := copy(in1, pos('/', in1) + 1, length(in1));
end;
result := in1;
end;
function Download(var host1, file1: string): Boolean;
var
url1: string;
buf1: Tbuf_byte;
rec1: longint;
f1: file;
cmd1: string; //这一行的内容
reclen1, real_reclen1: longint; //服务器返回的长度;实际已经收到的长度
value1: string; //标志们的值
total_len1: longint; //数据总长
begin
try
//self.filename1:='c:\temp1.dat';
assignfile(f1, file1);
Form_Update.can_rec1 := false;
Form_update.stop1 := false;
if FileExists(file1) = true then