MoveFileEx()重启

时间:2015-06-19 13:36:20

标签: c++ windows winapi

目前我可以在重启时删除目录。我目前正在使用MoveFileEx函数并传递MOVEFILE_DELAY_UNTIL_REBOOT常量。

我的问题是,如果我有以下内容:

目录1和内部我有目录2 ...目录2未被阻止,这意味着需要删除该目录,但因为目录1中只有一个目录,这意味着我可以删除目录1,这将依次删除目录2.但是,在我将目录1标记为在重新启动时删除后,我们可以说另一个目录已经安装到目录1中,名为目录3.在这种情况下,只有目录2应该被删除,因为我们不会删除目录3。

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

2 个答案:

答案 0 :(得分:0)

答案是,如果目录或文件未标记为要删除,则不会删除其所在的目录。 (正如IInspectable指出的那样)

  

"系统删除标记为删除的目录   MOVEFILE_DELAY_UNTIL_REBOOT仅在标志为空时标记。"

答案 1 :(得分:0)

  

但是让我们说在标记了目录1以便在重新启动时删除另一个目录已经安装到名为目录3的目录1中。在这种情况下,只应删除目录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标志为空时,系统才会删除标记为删除的目录。要确保删除目录,请在尝试删除目录之前移动或删除目录中的所有文件。文件可能在引导时位于目录中,但在系统删除目录之前必须删除或移动它们。

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