zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    CF1368F
    CF1083F
    AGC030F
    AGC030E Less than 3
    CF1083C
    CF526G
    CF1408
    CF1408H Rainbow Triples
    CF1408I
    AGC019E
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2839358.html
Copyright © 2011-2022 走看看