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;
转载于:https://www.cnblogs.com/hnxxcxg/archive/2012/12/29/2839358.html
DATASNAP双缓存下载文件的更多相关文章
- 本地缓存下载文件,download的二次封装
来源:http://ask.dcloud.net.cn/article/524 源码下载链接 说明: (1)由于平时项目中大量用到了附件下载等功能,所以就花了一个时间,把plus的downlaod进行 ...
- 【php】header下载文件后,文件变大的问题;(ob_clean()清空缓存)
事由: 按照常理,为了下载一个生产的文件,都是使用header函数,指定下文件信息,然后开始下载,但是下载后发现,文件体积总是比源文件要大2个字节,源文件是24字节,下载后是26字节,查看服务器返回的 ...
- Android中用双缓存技术,加载网络图片
最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...
- Android 框架修炼-自己封装双缓存管理框架库
一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...
- Android从网络某个地址下载文件、写入SD卡
首先创建一个HttpDownloader类,获取下载文件的网络地址,将文件下载下来以String流的方式返回: public String download(String urlStr){ //url ...
- Javaweb学习笔记——上传下载文件
一.前言 在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为comm ...
- Servlet下载文件和http响应
下载文件等: 1.得到公共的内容ServletContext sc = this.getServletContext(); 2.在链接名字后面加个? 一个参数?参数1=值 两个参数?参数1=值& ...
- [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html 这个可以实现ImageView异步加载 ...
- 霸气!Nginx 中缓存静态文件秘籍
导读 这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设 ...
随机推荐
- 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速
这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...
- ”Unstanding the Bias-Variance Tradeoff“主题内容翻译
对预测模型讨论,预测误差(error)分两类:偏差(bias)造成的误差与方差(variance)造成的误差.最小化偏差与方差的一个权衡.理解这两类误差有利于诊断模型结果和避免过拟合和欠拟合. 偏差与 ...
- SIFT学习笔记之二 特征提取
特征提取函数: int _sift_features( IplImage* img, struct feature** feat, int intvls, double sigma, double c ...
- NDK学习笔记-JNI的引用
JNI中的引用意在告知虚拟机何时回收一个JNI变量 JNI引用变量分为局部引用和全局引用 局部引用 局部引用,通过DeletLocalRef手动释放对象 原因 访问一个很大的Java对象,使用之后还用 ...
- 学习UML图和时序图,以及IDEA种查看类之间关系
1.类之间的关系:(6种) 关系 表示 图示 解释 表明的结构和语义 泛化关系 带空心箭头的直线 A继承自B(B指代非抽象类) 继承结构 实现关系 带空心箭头的虚线 小汽车继承车(B指代抽象类) 继承 ...
- pycharm2017注册码
BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- bootstrap基础学习【表单含按钮】(二)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 数字麦克风PDM信号采集与STM32 I2S接口应用--笔记目录
数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...
- Django--Form组件使用出现的小bug记录--username拿到None
form过滤代码: class LoginForm(forms.Form): username = forms.CharField(max_length=20,min_length=3,label=' ...
- nginx 开启gzip压缩
Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度,! Web网站上的图片,视频等其它多媒体文件以及大文件,因为压缩效果不好,所以对于 ...