【问题标题】:MoveFileEx with MOVEFILE_DELAY_UNTIL_REBOOT deleting rather than moving带有 MOVEFILE_DELAY_UNTIL_REBOOT 的 MoveFileEx 删除而不是移动
【发布时间】:2025-10-01 10:00:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: winapi movefileex


    【解决方案1】:

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

    据我所知,仅依靠此功能没有直接的方法可以做您想做的事情。

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

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

    【讨论】:

    • +1 将文件放在应用目录的子目录中等待重启
    • 好吧,经过一番研究,我认为唯一的解决方案是按照您的建议进行操作:在调用 MoveFileEx 之前确保源文件位于同一卷上。我想这并不太麻烦,因为该服务具有所需的访问权限。感谢您的建议。
    最近更新 更多