Winapi MoveFileEx和MOVEFILE_延迟_直到_重新启动删除而不是移动

Winapi MoveFileEx和MOVEFILE_延迟_直到_重新启动删除而不是移动,winapi,movefileex,Winapi,Movefileex,我有一个自动更新系统,可以在重新启动时替换现有的程序文件。(可以说,这是一个非常复杂的程序,包含许多驱动程序、服务和用户级模块。真的没有其他方法。相信我。) 函数MoveFileEx与MOVEFILE_DELAY_一起使用,直到重新启动,以设置此文件替换。我发现它工作正常。但是,如果源文件和目标文件位于不同的驱动器上,则会删除目标文件,但不会移动源文件。结果是,当用户在不同于系统分区的驱动器上安装软件时,更新会删除产品文件,而不是更新它们 现在,我在MoveFileEx的文档中看到,在将文件从一

我有一个自动更新系统,可以在重新启动时替换现有的程序文件。(可以说,这是一个非常复杂的程序,包含许多驱动程序、服务和用户级模块。真的没有其他方法。相信我。)

函数MoveFileEx与MOVEFILE_DELAY_一起使用,直到重新启动,以设置此文件替换。我发现它工作正常。但是,如果源文件和目标文件位于不同的驱动器上,则会删除目标文件,但不会移动源文件。结果是,当用户在不同于系统分区的驱动器上安装软件时,更新会删除产品文件,而不是更新它们

现在,我在MoveFileEx的文档中看到,在将文件从一个卷移动到另一个卷时,应该使用MOVEFILE_COPY_ALLOWED。但它也表示,在重新启动之前,该标志不能与MOVEFILE_DELAY_一起使用


问:当源和目标不在同一卷上时,如何在重新启动时移动文件,覆盖现有文件?

为什么不将文件复制到用户安装程序的驱动器上

据我所知,仅仅依靠这个函数并没有直接的方法来做你想要做的事情

在Vista上查找同一驱动器上的可写位置可能是个问题,但您提到您有服务-如果它们使用LocalSystem权限运行,请让它们编写新文件


我使用过的另一个简单的更新机制(虽然不适用于驱动程序)是有专门的更新程序-杀死/结束所有内容,让更新程序完成工作并重新启动所有内容。

+1经过一些研究,将文件放在应用程序目录的子目录中,等待重新启动,我认为唯一的解决方案是按照您的建议执行:在调用MoveFileEx之前,确保源文件位于同一卷上。我想这不会太麻烦,因为服务具有所需的访问权限。谢谢你的建议。