【问题标题】:MoveFileEx() File removal on rebootMoveFileEx() 重新启动时删除文件
【发布时间】:2015-06-19 23:49:04
【问题描述】:

目前我可以在重新启动时删除目录。我目前通过使用MoveFileEx 函数以及传递MOVEFILE_DELAY_UNTIL_REBOOTconstant 来执行此操作。

我的问题是我是否有以下情况:

目录 1 和里面我有目录 2... 目录 2 未安装,这意味着需要删除目录,但由于目录 1 中只有一个目录,这意味着我可以删除目录 1,然后删除目录2. 但是让我们说,在我将目录 1 标记为在重新启动时删除之后,另一个目录已安装到目录 1 中,称为目录 3。在这种情况下,只有目录 2 应该被删除,因为我们不会删除目录 3。

我想知道是否有任何条件变量/常量可以帮助解决这种情况?

【问题讨论】:

  • MoveFileEx: “只有当它为空时,系统才会删除带有 MOVEFILE_DELAY_UNTIL_REBOOT 标志的目录。” 文档应该是您的第一个信息来源。试试看!
  • 在我发布了@IInspectable 的问题后,我实际上看到了这一点。无论如何,谢谢

标签: c++ windows winapi


【解决方案1】:

答案是,如果一个目录或文件没有被标记为删除,那么它所在的目录将不会被删除。 (正如 IInspectable 所指出的)

"系统删除一个带有删除标记的目录 仅当 MOVEFILE_DELAY_UNTIL_REBOOT 标志为空时。”

【讨论】:

    【解决方案2】:

    但是可以说,在我将目录 1 标记为在重新启动时删除之后,另一个目录已安装到目录 1 中,称为目录 3。在这种情况下,只应删除目录 2,因为我们不会删除目录 3。

    没有用于“取消标记”已标记为在重新启动时删除的文件/目录的 API。您必须直接更新注册表才能从列表中删除项目。 MoveFileEx() documentation 告诉您使用了哪个注册表项:

    该函数将重新启动时要重命名的文件的位置存储在以下注册表值中:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

    此注册表值的类型为 REG_MULTI_SZ。每个重命名操作都存储以下以 NULL 结尾的字符串之一,具体取决于重命名是否为删除:

    • szDstFile\0\0

    • szSrcFile\0szDstFile\0

    字符串 szDstFile\0\0 表示文件 szDstFile 将在重启时被删除。字符串 szSrcFile\0szDstFile\0 表示 szSrcFile 将在重新启动时重命名为 szDstFile

    另一方面,文档还说:

    只有当目录为空时,系统才会删除带有 MOVEFILE_DELAY_UNTIL_REBOOT 标志标记为删除的目录。为确保删除目录,请在尝试删除目录之前移动或删除目录中的所有文件。引导时文件可能在目录中,但必须先删除或移动它们,系统才能删除目录。

    但这只提到文件,而不是子目录

    【讨论】: