一。怎么自动提取服务器的最新文件版本呢?
二。比较版本后怎么下载到客户端呢?
谢谢》》》》》

解决方案 »

  1.   

    csdn上的软件栏目有现成的例子,自己找找!
      

  2.   

    1。在server上开个ftp service。
    2。将需要更新的文件放置在ftp指定的目录中。
    3。每次客户端启动的时候,连接ftp到server,根据文件的修改日期遍历所有的文件。
    4。如果有更新的文件,则下载到本地覆盖之。
    5。可执行文件或者DLL,可以根据文件的版本号,判断文件的最新版本,文件的版本设置可参见DLEPHI IDE MENU
    注意:1。当主应用程序有最新版本的时候,需要更新主程序自己。
          2。遍历ftp上目录的时候,需要递归遍历所有目录,有新的目录建立的话,客户端也应该
             与之同步更新。
    建议使用Indy 9 中的FTP Client Component.在Delphi 5中编译的时,会有异常但不影响使用,Delphi 7中没有此现象。
      

  3.   

    谢谢subsky(猛回头): 请问通过ftp连接完服务器后用什么判断文件的修改日期和版本号呢?
                          还有能不能提供遍历目录的代码呢?十分感谢!
      

  4.   

    我用了累似newyu的方法实现了internet client的自动升级,
      

  5.   

    可以去这里看一看,免费提供,绝对实用:
    http://www.aslike.net
      

  6.   

    newya的方法比subsky(猛回头),因为效率比猛回头的方法高,猛回头里有太多的遍历,效率不高。但如果Dll或EXE载入了内存,则不给改名或删除,你怎么更新?
      

  7.   

    编写通用的程序更新模块陈平 朱洪涛 目前,大多数商业软件都提供一种“在线升级”的功能,用户只需上网点几下鼠标即可完成程序的更新升级。笔者所在的单位拥有一个连接了上百台计算机的局域网,上面运行着一套信息管理系统。为解决客户端应用程序的更新升级,笔者编制了一个实现自动更新功能的模块。该模块能在不同的编程语言中实现升级功能,具有一定的通用性和灵活性。本文介绍该模块(PiUpdate)的设计思路和实现方法。
     
     
    实现原理 
    PiUpdate模块的基本设计思想是将要更新的文件放在文件服务器上,工作站上的程序启动时调用PiUpdate, 对比服务器上的文件和本地的文件,如发现有新文件,则更新本地的对应文件。 
    首先,考虑到通用性的要求,将该模块设计成一个Windows标准的动态链接库(DLL),并在DLL中提供一个接口函数供其他程序调用。由于几乎各种开发工具都支持DLL调用机制,这样就保证了模块的通用性。 
    其次,为了灵活控制具体的更新文件,笔者使用了一个ini文件来提供相关的更新信息。ini文件名在主程序调用DLL接口函数时传入程序。 
    接口函数的定义形式如下: 
    function ExecuteUpdate(IniFileName:Pchar):integer; stdcall; 
    如果更新成功,则返回0,如果出现错误,则返回-1; 当将要更新的文件被运行中的应用程序使用时,接口函数会向主程序返回1。 
    接口函数的调用形式如下: 
    Delphi调用:function ExecuteUpdate(inifilename:pchar):integer;stdcall;external ‘PiUpdate.dll’; 
    PB调用:function integer ExecuteUpdate(ref string name) library“PiUpdate.dll” 
    考虑到不同编程语言中字符串存储形式不尽相同,函数参数采用了Windows API标准的C语言字符串形式,并且调用形式也采用Windows标准的StdCall形式。 
    配置ini文件的形式如下: 
    [程序名称] 
    filename1=\\Server\Share\filename1 
    filename2=\\Server\Share\filename2 
    … 
    更新方法 
    本文在更新一般文件时,使用的是CopyFile API。对于正在使用的文件,这个方法就行不通了。开始时,笔者查找了Windows API的有关资料,发现MoveFileEx函数可以在Windows重新启动时更新指定文件,这可以作为一种更新正在使用的文件的方法。但如果只是更新一个小程序,就要用户重新启动,有点小题大做的味道。后来,笔者在网上看到HAPPYZSL的一篇文章,发现其中使用的技巧十分有效。更新过程的思路是:如果发现被更新的文件正在使用,则将源文件复制到本地的一个临时文件,并建立一个del.BAT文件。在程序结束时运行该BAT文件,以完成对这些正在使用的文件的更新。del.BAT文件的内容如下: 
    @echo off 
    : loop 
    del destfile  
    if exist destfile goto loop  
    copy tmpfile destfile 
    del tmpfile 
    del .\del.bat 
    由于del.BAT运行后会一直执行,直到成功地删除了目标文件为止,所以主程序在检测到接口函数ExecuteUpdate返回值为1时,要立即退出,以便del.BAT能顺利地执行下去。 
    程序实现 
    主程序的实现代码如下: 
    function ExecuteUpdate(IniFileName: Pchar):integer; 
    //返回值:0 更新成功;-1 更新出错; 1 要更新的文件正在使用,需要立即退出程序 
    begin 
    result: =-1 ; 
    //获取配置文件名称 
    FName: =StrPas(IniFileName);  
    ProgList: =TStringList.Create; 
    try 
    //初始化更新配置信息 
    if InitUpdate(FName) then 
    begin 
    UpdateList:=TStringList.Create; 
    try 
    //检查需要更新的文件 
    if CheckNeedUpdate(ProgList, 
    UpdateList) then  
    //执行更新操作 
    result: =DoUpdate(UpdateList)  
    else 
    result: =0; 
    finally 
    UpdateList.Free; 
    end; 
    end; 
    finally 
    ProgList.Free; 
    end; 
    end; 
    小 结 
    如果在建立ini文件时,没有指定文件的目录位置,则默认使用Windows的系统目录,所以在调用接口函数时最好用ini文件的全路径名称。如果不方便给出全路径名称,也可以采用“.\filename.ini”的形式进行调用。 
    对于文件是否需要更新,程序员可以根据实际情况来编写判断标准。为方便修改,在程序中将其写成函数FileDiff(sFile,dFile: string)的形式,可以加上文件大小、版本号等条件。 
    为了使更新过程能更加完善,建议将本模块及更新配置文件也放在服务器上相应的共享目录下,并作为待更新的文件加到更新文件列表中。这样一来,如果服务器端的PiUpdate.dll更新了,用户的PiUpdate.dll也会同样得到更新。如果由于程序功能的增加,加入了新的文件,只要将新加的文件放到服务器上,并修改服务器上的更新配置文件,工作站上的程序启动时会先将新的配置文件复制到本地,下次本地程序再启动时就可以更新新加入的文件。