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;

  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2839358.html
Copyright © 2011-2022 走看看