DATASNAP双缓存下载文件

Posted railgunman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DATASNAP双缓存下载文件相关的知识,希望对你有一定的参考价值。

原文链接:http://www.cnblogs.com/hnxxcxg/archive/2012/12/29/2839358.html

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;

转载于:https://www.cnblogs.com/hnxxcxg/archive/2012/12/29/2839358.html

以上是关于DATASNAP双缓存下载文件的主要内容,如果未能解决你的问题,请参考以下文章

DataSnap REST JavaScript 客户端 – 如何显示从 TServerMethods 方法返回为 TStream 的 pdf 文件数据

Delphi 三层框架 DataSnap 的服务器端设置

Android图片二级缓存

在datasnap 中使用unidac 访问数据(服务器端)

thinkphp5下载文件对原文件有5分钟缓存

小米手机浏览器缓存文件在哪