Windows下次启动时删除文件的原理及应用

Windows 下删除文件、尤其卸载程序时,有时会提示“下次启动时删除”,这是Windows底层提供的一个功能,具体来说是,把要删除的文件路径写到注册表里一个特定位置,下次Windows启动时,会自动检测这个位置里写的文件路径,删除它们。

这个位置在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

下的 PendingFileRenameOperations ,是一个长文本数据,如果已经写入了待删除文件列表,大致如下

\??\C:\Users\feng\AppData\Local\Temp\Au_.exe

\??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp\Un_A.exe

\??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp

更具体的说,这个注册表项是由win32 api 函数 moveFileExW 函数 (winbase.h) 写入的,该函数调用时第三个参数指定了 MOVEFILE_DELAY_UNTIL_REBOOT 标志。https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-movefileexw

这样就会造成一个问题:有时卸载程序后提示某个文件要重启后删除,但又不想重启系统,并且,已经找到相关文件是哪个进程在占用并结束掉了,然后手工删掉了相关文件。

这时,如果还想重新安装该程序,安装向导很可能会提示,需要重启系统才能继续。但又不想重启系统。那么,该怎么办呢?

这时,只要到上述注册表项里,把相关行删掉,再运行安装程序,就可以继续了。其实最好是把所有行里的待删除文件都手工删除掉,再清空该注册表项。