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. 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速

    这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...

  2. ”Unstanding the Bias-Variance Tradeoff“主题内容翻译

    对预测模型讨论,预测误差(error)分两类:偏差(bias)造成的误差与方差(variance)造成的误差.最小化偏差与方差的一个权衡.理解这两类误差有利于诊断模型结果和避免过拟合和欠拟合. 偏差与 ...

  3. SIFT学习笔记之二 特征提取

    特征提取函数: int _sift_features( IplImage* img, struct feature** feat, int intvls, double sigma, double c ...

  4. NDK学习笔记-JNI的引用

    JNI中的引用意在告知虚拟机何时回收一个JNI变量 JNI引用变量分为局部引用和全局引用 局部引用 局部引用,通过DeletLocalRef手动释放对象 原因 访问一个很大的Java对象,使用之后还用 ...

  5. 学习UML图和时序图,以及IDEA种查看类之间关系

    1.类之间的关系:(6种) 关系 表示 图示 解释 表明的结构和语义 泛化关系 带空心箭头的直线 A继承自B(B指代非抽象类) 继承结构 实现关系 带空心箭头的虚线 小汽车继承车(B指代抽象类) 继承 ...

  6. pycharm2017注册码

    BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  7. bootstrap基础学习【表单含按钮】(二)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 数字麦克风PDM信号采集与STM32 I2S接口应用--笔记目录

    数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...

  9. Django--Form组件使用出现的小bug记录--username拿到None

    form过滤代码: class LoginForm(forms.Form): username = forms.CharField(max_length=20,min_length=3,label=' ...

  10. nginx 开启gzip压缩

    Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度,!  Web网站上的图片,视频等其它多媒体文件以及大文件,因为压缩效果不好,所以对于 ...