局域网内的文件自动更新的问题,给思路也行网内一台服务器,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编译  希望有高手指点下,非常感谢

解决方案 »

  1.   

    IntToStr(GetFileVersion(AFileName)取得版本号
    在DELPHI的Project->Option VersionInfo选项卡里把Include Version information in Project选上
    或者在文件名字上想办法也可以啊 ,办法很多
    还有第三方的自动更新组件也可以用
      

  2.   

    function GetFileVersion(FileName: string): string; 
       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选项卡里加版本信息要改上面那四个框的内容,编译后才能有正确的版本信息