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双缓存下载文件的更多相关文章

  1. 本地缓存下载文件,download的二次封装

    来源:http://ask.dcloud.net.cn/article/524 源码下载链接 说明: (1)由于平时项目中大量用到了附件下载等功能,所以就花了一个时间,把plus的downlaod进行 ...

  2. 【php】header下载文件后,文件变大的问题;(ob_clean()清空缓存)

    事由: 按照常理,为了下载一个生产的文件,都是使用header函数,指定下文件信息,然后开始下载,但是下载后发现,文件体积总是比源文件要大2个字节,源文件是24字节,下载后是26字节,查看服务器返回的 ...

  3. Android中用双缓存技术,加载网络图片

    最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...

  4. Android 框架修炼-自己封装双缓存管理框架库

    一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...

  5. Android从网络某个地址下载文件、写入SD卡

    首先创建一个HttpDownloader类,获取下载文件的网络地址,将文件下载下来以String流的方式返回: public String download(String urlStr){ //url ...

  6. Javaweb学习笔记——上传下载文件

    一.前言 在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为comm ...

  7. Servlet下载文件和http响应

    下载文件等: 1.得到公共的内容ServletContext sc = this.getServletContext(); 2.在链接名字后面加个? 一个参数?参数1=值 两个参数?参数1=值& ...

  8. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  9. 霸气!Nginx 中缓存静态文件秘籍

    导读 这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设 ...

随机推荐

  1. list列表转tree树方法

    list转tree递归转换 /** * 递归遍历节点 * @param sourceList * @param parentCode * @return */ public List<Offic ...

  2. 图像欧拉数计算 matlab实现

    EUL = C - H 其中EUL表示欧拉数  C表示对象数 H表示孔洞数 欧拉数常用来识别数字: 识别数字 8 ,8 的欧拉数为 -1 ,不同于0,1,2,3,4,5,6,7,9 close all ...

  3. harbor清理存储

    harbor仓库中镜像按tag清理,删除tag后需要清理gc才能释放空间 #!/bin/bash set -e HARBOR_URL=127.0.0.1 HARBOR_PASSWD=harbor123 ...

  4. qt坐标系统见解

    窗口坐标为逻辑坐标,是基于视口坐标系的. 视口坐标为物理坐标,是基于绘图设备坐标系的 窗口坐标始终以视口坐标为最终目标进行映射: QPainter::setWindow 修改了窗口位置和大小(左上角重 ...

  5. 生产环境中的 redis 是怎么部署的

    redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰q ...

  6. MapReduce 框架原理

    1. Hadoop 序列化 1.1 自定义Bean对象实现序列化接口 必须实现 Writable 接口: 反序列化时,需要反射调用空参构造函数,所以必须有空参构造: 重写序列化方法: 重写反序列化方法 ...

  7. jdk1.8 -- 自定义FunctionInterface

    一.自定义函数的理解 对于java提供的一些函数,用lambda表达式是可以解决一些问题的,但是在对于一些比较复杂的数据类型在处理时,可能会有些力不从心了,但是 我们可以通过自定义的一些函数,通过使用 ...

  8. 【AtCoder】ARC068

    ARC 068 C - X: Yet Another Die Game 显然最多的就是一次6一次5 最后剩下的可能需要多用一次6或者6和5都用上 #include <bits/stdc++.h& ...

  9. 【规律】A Rational Sequence

    题目描述 An infinite full binary tree labeled by positive rational numbers is defi ned by:• The label of ...

  10. 「网络流 24 题」最长 k 可重区间集

    给定区间集合$I$和正整数$k$, 计算$I$的最长$k$可重区间集的长度. 区间离散化到$[1,2n]$, $S$与$1$连边$(k,0)$, $i$与$i+1$连边$(k,0)$, $2n$与$T ...