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 文件)设 ...
随机推荐
- 【世界之大,我用Python】Ubuntu 自动删除自带软件
起因 Ubuntu是用来做开发程序的系统,如果存在大量的"垃圾"软件就不好了吧,不仅影响系统性能而且还会经常报错,所以每次安装完系统都会清理一次系统. 操作 我清理系统一般都是直接 ...
- 【VS开发】千兆以太网的传输速度
千兆以太网主流标准 千兆以太网络技术早在上世纪90年代末就已成熟,其中,1995年国际标准化组织TIA/EIA颁布了1000Base-TX标准,该标准的目的是把双绞线用于千兆以太网中,其目的是在6类非 ...
- rabbitmq启动方式
1.以应用方式启动 rabbitmq-server -detached 后台启动 Rabbitmq-server 直接启动,如果你关闭窗口或者需要在改窗口使用其他命令时应用就会停止 关闭:rabbi ...
- shell 监控
#!/bin/shsource /etc/profileserverName=$1dingDingName=$2 #获取内存情况memory=(`free | awk 'NR==2{print $2, ...
- leveldb单元测试之宏定义源码剖析
前言 leveldb 是一个库,没有 main() 函数入口, 故非常难理清其中的代码逻辑.但好在库中有非常多的单元测试代码,帮助读者理解其中的各个模块的功能.然而,测试代码个人觉得一开始看时非常费解 ...
- [转帖]你不曾见过的国产CPU:可能是最全的龙芯系列芯片家谱(下)
你不曾见过的国产CPU:可能是最全的龙芯系列芯片家谱(下) https://www.ijiwei.com/html/news/newsdetail?source=pc&news_id=7177 ...
- 导出远程oracle数据库到本地
1.以管理员身份运行 Net Manager 以管理员身份运行cmd
- flink两种安装方式
Flink Standalone 集群 HA 配置 1. HA 集群环境规划 使用三台节点实现两主两从集群(由于笔记本性能限制,不能开启太多虚拟机,其实使用三 台和四台机器在安装配置上没有本质区别) ...
- codeforces 1244C (思维 or 扩展欧几里得)
(点击此处查看原题) 题意分析 已知 n , p , w, d ,求x , y, z的值 ,他们的关系为: x + y + z = n x * w + y * d = p 思维法 当 y < w ...
- Mysql定时备份[Windows]
基于mysql5.6.39版本 一.备份脚本 1.windows环境创建批处理文件 @echo off rem ******MySQL backup start****** set mysqlHome ...