VC ++中的SelfDeleting应用程序?

时间:2010-06-07 05:16:03

标签: visual-c++

我想删除包含当前正在运行的应用程序的文件夹。我该怎么做..?这有什么办法吗?应用程序运行完毕后,应该删除包含应用程序的文件夹吗?

3 个答案:

答案 0 :(得分:4)

您最好的选择可能是使用Win32 API MoveFileEx。它有一个标志,可以设置为在下次重新启动时使用它们时删除文件MOVEFILE_DELAY_UNTIL_REBOOT。将MoveFileEx的新文件名参数设置为NULL以执行此类删除。

  

如果dwFlags指定   MOVEFILE_DELAY_UNTIL_REBOOT和   lpNewFileName为NULL,MoveFileEx   注册lpExistingFileName文件   系统时要删除   重新启动。

注意:正在使用的普通文件可以使用Win32 API DeleteFile正常删除,具体取决于它们是否以CreateFile权限打开(使用Win32 API FILE_SHARE_DELETE)。我不认为Windows上默认运行程序具有该权限。如果指定要删除的文件正在使用但使用此标志打开,则在关闭最后一个文件句柄时将删除该文件。

答案 1 :(得分:1)

这很毛茸茸。我必须为自修补应用程序实现一次,其中修补程序必须(通过客户端请求)在安装修补程序后自行删除。您可以通过启动帮助程序DLL来删除您的进程以及自身。

可以在此处找到删除流程的完整方法:http://www.handcraftedbytes.com/articles/writing-install-and-uninstall

正如其他人所指出的,当你的可执行文件存在时,你将无法删除它所在的文件夹。我的建议是:

  • 使用MoveFileEx将可执行文件移至临时目录
  • 删除您的应用程序目录
  • 使用上面链接中描述的自删除DLL方法删除您的可执行文件。

答案 2 :(得分:0)

您无法删除当前正在运行的可执行文件,但可以删除当前正在运行的批处理文件(cmd.exe将整个文件加载到内存中,然后您可以删除它)。

所以最简单的解决方案是启动一个试图在循环中删除.exe的批处理(因为它可能无法在第一次工作 - 直到你的.exe被卸载)然后退出你的进程 - 批处理文件仍在运行。