局域网内的文件自动更新的问题,给思路也行网内一台服务器,N台客户机 运行的系统属于C/S架构的我已经把服务端检测更新的模块写好了,并写成了系统服务类型的程序,我是这样想的,当客户端每次启动时,会先启动一个叫AuotUpd的程序,该程序通过SOCKET也好什么也好跟服务器上的那个更新的系统服务联系上, 而服务器上的那个更新服务则负责在去检查 有无文件更新
现在关键堵就是在这了,通过一个什么机制去检查文件是否有更新?以前我传统的做法是,比如我现在要更新A.EXE到客户那去,那么首先我要连到客户的远程把这个文件手动拷贝到客户的服务器上,当然,备份老的同名文件是必须的,以前我就是采用文件共享目录的方式现在我改变了方式,不采用文件共享的方式 而是用自己写的系统服务程序来判断是否有更新,有就通过TCPIP来传送给各个连接过来的客户端现在的问题是如何判断是否有更新,所以我在服务器上建立了一个A表,A表的大致结构如下:
FILENAME PATH VERSION VERSION_OLD COMPUTER
文件名 路径 当前版本号 之前版本号 存放已经更新过的客户端的一些标识
现在的问题是,如果还是采用传统的手动拷贝去更新,那么就无法满足这个更新条件了,除非更新的人在手动去修改这个表对应这次更新的2个VERSION,明显这不现实所以我想必须要有个自动安装包,就有点类似,很多杀软的离线更新包当用户拿到这个离线更新包的时候,只需要运行他,就会自动做以下的事:
1.将当前要更新的文件释放出来,并把指定目录中的同名文件做改名备份
2.将当前释放出的要更新文件的版本号读取到,并存入A表的VERSION字段里
3.将改名备份的那个文件的版本信息读到,并存入A表的VERSION_OLD里这样剩下的东西就可以交给我写的系统服务去做了,它会去判断并传输文件之所以写想到用系统服务程序代替文件共享的方式,是因为系统服务方便,只要程序健壮性好,一直RUN,而且,由于采用的是TCPIP的方式,所以只要关心端口是否通常和网络的常规原因就够了.我不太赞成文件共享的方式进行更新,因为我们以前也是这样做的,这样做病垢比较大,首先文件共享对于维护上时长发生一些与操作系统相关的问题,对下面的人来说,维护难度比较大比如 局域网内的访问问题,特别是不同操作系统间的互相访问比如XP,2003等.第2,我也不大赞成用修改时间来做判断标准的,不太利于版本管理,而且修改时间或多或少会存在些误差
现在就是这个离线更新包怎么去做的问题我原先首先想到的是通过资源文件里打包要更新的文件,但这样不太方便,因为有可能有时我的更新比较频繁,这样的更新包不利于维护人员的使用毕竟制作好RES后,还要DELPHI编译 希望有高手指点下,非常感谢
现在关键堵就是在这了,通过一个什么机制去检查文件是否有更新?以前我传统的做法是,比如我现在要更新A.EXE到客户那去,那么首先我要连到客户的远程把这个文件手动拷贝到客户的服务器上,当然,备份老的同名文件是必须的,以前我就是采用文件共享目录的方式现在我改变了方式,不采用文件共享的方式 而是用自己写的系统服务程序来判断是否有更新,有就通过TCPIP来传送给各个连接过来的客户端现在的问题是如何判断是否有更新,所以我在服务器上建立了一个A表,A表的大致结构如下:
FILENAME PATH VERSION VERSION_OLD COMPUTER
文件名 路径 当前版本号 之前版本号 存放已经更新过的客户端的一些标识
现在的问题是,如果还是采用传统的手动拷贝去更新,那么就无法满足这个更新条件了,除非更新的人在手动去修改这个表对应这次更新的2个VERSION,明显这不现实所以我想必须要有个自动安装包,就有点类似,很多杀软的离线更新包当用户拿到这个离线更新包的时候,只需要运行他,就会自动做以下的事:
1.将当前要更新的文件释放出来,并把指定目录中的同名文件做改名备份
2.将当前释放出的要更新文件的版本号读取到,并存入A表的VERSION字段里
3.将改名备份的那个文件的版本信息读到,并存入A表的VERSION_OLD里这样剩下的东西就可以交给我写的系统服务去做了,它会去判断并传输文件之所以写想到用系统服务程序代替文件共享的方式,是因为系统服务方便,只要程序健壮性好,一直RUN,而且,由于采用的是TCPIP的方式,所以只要关心端口是否通常和网络的常规原因就够了.我不太赞成文件共享的方式进行更新,因为我们以前也是这样做的,这样做病垢比较大,首先文件共享对于维护上时长发生一些与操作系统相关的问题,对下面的人来说,维护难度比较大比如 局域网内的访问问题,特别是不同操作系统间的互相访问比如XP,2003等.第2,我也不大赞成用修改时间来做判断标准的,不太利于版本管理,而且修改时间或多或少会存在些误差
现在就是这个离线更新包怎么去做的问题我原先首先想到的是通过资源文件里打包要更新的文件,但这样不太方便,因为有可能有时我的更新比较频繁,这样的更新包不利于维护人员的使用毕竟制作好RES后,还要DELPHI编译 希望有高手指点下,非常感谢
解决方案 »
- cxgrid查询后如何禁止对数据的修改
- 测试
- 异步串行通信,如何得知数据真正发送完毕?
- 请教!Sql Server的sql语句问题??
- 如何在程序中如何填充某一网页中输入控件值,并且自动提交?
- TTcpServer 和TTcpClient 问题
- 如何将一个ANSISTRING字符串清空?
- toolbar放在controlbar中,给toolbar上的toolbutton指定一个菜单,为什么快捷键失效了?
- 一个可以随意改变键盘现有布局的 Delphi 程序.(附送源代码)
- 在我的程序下有很多:~dfm/~pas文件 ,是不是临时文件?可否将它们毫不顾虑的删除?
- 如何做到换行,在HOSTS文件中加记录。谢谢。
- 如何避免每次打开Form时,.dfm 文件自动改变
在DELPHI的Project->Option VersionInfo选项卡里把Include Version information in Project选上
或者在文件名字上想办法也可以啊 ,办法很多
还有第三方的自动更新组件也可以用
type
PVerInfo = ^TVS_FIXEDFILEINFO;
TVS_FIXEDFILEINFO = record
dwSignature: longint;
dwStrucVersion: longint;
dwFileVersionMS: longint;
dwFileVersionLS: longint;
dwFileFlagsMask: longint;
dwFileFlags: longint;
dwFileOS: longint;
dwFileType: longint;
dwFileSubtype: longint;
dwFileDateMS: longint;
dwFileDateLS: longint;
end;
var
ExeNames: array[0..255] of char;
zKeyPath: array[0..255] of Char;
VerInfo: PVerInfo;
Buf: pointer;
Sz: word;
L, Len: Cardinal;
begin
StrPCopy(ExeNames, FileName);
Sz := GetFileVersionInfoSize(ExeNames, L);
if Sz=0 then
begin
Result:='';
Exit;
end; try
GetMem(Buf, Sz);
try
GetFileVersionInfo(ExeNames, 0, Sz, Buf);
if VerQueryValue(Buf, '\', Pointer(VerInfo), Len) then
begin
Result := IntToStr(HIWORD(VerInfo.dwFileVersionMS)) + '.' +
IntToStr(LOWORD(VerInfo.dwFileVersionMS)) + '.' +
IntToStr(HIWORD(VerInfo.dwFileVersionLS)) + '.' +
IntToStr(LOWORD(VerInfo.dwFileVersionLS));
end;
finally
FreeMem(Buf);
end;
except
Result := '-1';
end;
end;
Option VersionInfo选项卡里加版本信息要改上面那四个框的内容,编译后才能有正确的版本信息