比如我的执行文件是 acdc3224.exe ,它正在运行。
然后通过acdc3224.exe内置的自动更新功能,
提示要从服务器上下载了一个最新版本执行文件 acdc3224.exe,
如何下载文件好说,我已经解决。而问题是,下载的时候我肯定不能下载
把下载文件下载到和执行程序同一目录下。因为 acdc3224.exe正在运行,
而你下载一个新acdc3224.exe时,肯定会出现冲突。这种情况在复制粘贴时,
经常发生。
所以我是这样考虑的,现把 新acdc3224.exe 下载到一个目录updata里面,
就像金山毒霸一样。但怎样把最新的文件复制出来呢?有点郁闷~ 大家来讨论。

解决方案 »

  1.   

    try this:
    用另外的exe来完成更新,先下载,然后关闭acdc3224.exe,然后覆盖acdc3224.exe,然后再运行如果是更新update.exe,那么可能这样行:退出前写一个.bat(内容是执行更新,然后重新启动update.exe)之类的,然后退出update.exe的同时运行这个.bat(用shellexecute,handle用0).
      

  2.   

    Win2k下 可以改正在执行的exe文件的文件名,可以先把旧的改名。
      

  3.   

    大哥你呀?
    这问题据说可以有这么几种方法解决1
    下载到updata文件夹中,然后用copy函数(api),中间有一个boolean标志,可以表示是直接覆盖原来文件,还是不进行操作2 
    打开程序运行的时候,判断在这个updata目录下是否有版本更新的程序,如果有,关闭这个版本低的程序,而调用那个版本高的程序。然后在版本高的程序退出的时候,把自身复制到安装目录下3
    可以复制到一个地方,然后先删除源文件,再copy过去后重新命名
      

  4.   

    哦,那就这样啊把程序分成几个模块,就如楼上你说的那样。
    然后我用一个updata的EXE程序,用来检测更新。对于一般的文件,就是copyfile就OK了,如果是正在运行的这个acdc3224.exe程序,可以使用MoveFileEx这个函数。这个函数可以在Windows重新启动时更新指定文件。如果也不允许重新启动的话,那么也就只有上面提到的那个bat了
    (如果发现被更新的文件正在使用,则将源文件复制到一个临时文件,并建立一个acdc3224.bat文件。在程序结束时运行这个bat文件,完成对这些正在使用的文件的更新)
      

  5.   

    嗯~bat有道理。其实,毒霸也是这样做的。
    毒霸就是写Autoexec.bat文件。
    然后提示我们重启系统。
      

  6.   

    你在update文件夹中的文件本来就是下载最新的啊!!如果因为文件正在使用而不能马上替换的话,可以先提示用户重新启动计算机,关闭正在运行的程序之后更新就行了。也就是把所有需要进行的更新操作写成一个exe,比如把对主程序文件的复制操作写成 operate.exe ,然后改动注册表,让计算机重起以后便马上运行operate.exe,就可以完成更新功能了。