delphi DATASNAP双缓存下载文件


delphi DATASNAP双缓存下载文件

procedure TFrmMain.btnUpdateFilesClick(Sender: TObject);
begin
 try
 if Assigned(gEXEmm) then
 FreeAndNil(gEXEmm);
 if Assigned(gINImm) then
 FreeAndNil(gINImm);

 gEXEmm := TFileStream.Create(ExtractFilePath(Application.ExeName) +
 'download\jlpos.exe', fmOpenRead);
 gINImm := TFileStream.Create(ExtractFilePath(Application.ExeName) +
 'download\client.ini', fmOpenRead);

 gEXEmm2.Clear;
 gINImm2.Clear;
 gEXEmm2.CopyFrom(gEXEmm, 0);
 gINImm2.CopyFrom(gINImm, 0);

 FreeAndNil(gEXEmm);
 FreeAndNil(gINImm);
 except
 on E: Exception do
 begin
 gSysLog.WriteLog('btnUpdateFilesClick: ' + E.Message);
 Exit;
 end;
 end;
end;

function TServerMethods1.DownLoadFile(const FileName: string): TStream;
var
 f: string;
begin
 Result := nil;
 try
 f := ExtractFilePath(Application.ExeName) + 'download\' + FileName;
 if not FileExists(f) then
 Exit;
 Result := TMemoryStream.Create;
 if LowerCase(FileName) = 'jlpos.exe' then
 Result.CopyFrom(gEXEmm2, 0)
 else if LowerCase(FileName) = 'client.ini' then
 Result.CopyFrom(gINImm2, 0);
 Result.Position := 0;
 except
 on E: Exception do
 begin
 gSysLog.WriteLog('DownLoadFile: ' + E.Message);
 Exit;
 end;
 end;
end;

function TdmCommonFun.DownLoadFile(const FileName: string): Boolean;
var
 a: TServerMethods1Client;
 ini: TIniFile;
 Stream, ms: TStream;
 Buffer: TBytes;
 ReadCount: Integer;
const
 BufSize = $F000;
begin
 Result := False;
 if (not TryConnectAPPServer) or (FileName = '') then
 Exit;
 a := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
 ms := TMemoryStream.Create;
 try
 Stream := a.DownLoadFile(FileName);
 if Stream.Size = -1 then
 begin
 SetLength(Buffer, BufSize);
 repeat
 ReadCount := Stream.Read(Buffer[0], BufSize);
 if ReadCount > 0 then
 ms.WriteBuffer(Buffer[0], ReadCount);
 if ReadCount < BufSize then
 break;
 until ReadCount < BufSize;
 end
 else
 begin
 ms.CopyFrom(Stream, 0);
 end;
 // delete bak files
 if FileExists(ExtractFilePath(Application.ExeName) + FileName + 'bak') then
 DeleteFile(PWideChar(ExtractFilePath(Application.ExeName) + FileName
 + 'bak'));
 // 现有文件改名
 if FileExists(ExtractFilePath(Application.ExeName) + FileName) then
 begin
 RenameFile(ExtractFilePath(Application.ExeName) + FileName,
 ExtractFilePath(Application.ExeName) + FileName + 'bak');
 end;
 // 下载最新文件
 TMemoryStream(ms).SaveToFile(ExtractFilePath(Application.ExeName) +
 FileName);
 // 更新本机版本号
 ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'client.ini');
 try
 ini.WriteInteger(FileName, 'ver', GetVer(FileName));
 finally
 ini.Free;
 end;
 finally
 a.Free;
 ms.Free;
 end;
 Result := True;
end;

来源:http://www.cnblogs.com/hnxxcxg/archive/2012/12/29/2839358.html


联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678