当我使用最新版本的 McAfee Antivirus 时,我注意到粉碎功能可以删除正在运行的文件,然后要求您重新启动计算机。有谁知道它如何删除正在运行的文件而不关闭它们?
问问题
29 次
1 回答
0
它可能取决于操作系统和文件系统类型。在 Linux 和 Unix 上,删除文件只是从文件夹中删除一个条目。如果没有文件夹条目指向该文件,则该文件实际上在上次关闭时被删除。因此,即使文件在另一个进程中打开,您也可以安全地删除该文件。
在 Windows 上,MSDN说:
如果应用程序尝试删除为正常 I/O 或作为内存映射文件打开了其他句柄的文件,DeleteFile 函数将失败
通常的技巧包括:
- 尝试关闭对该文件具有句柄的所有进程。对于可执行文件,它通常意味着终止其所有实例
- 标记文件以在下次重新启动时删除。正如您所说,迈克菲要求重新启动计算机,它可能使用该选项。WINAPI 函数对此
MoveFileEx
进行了规定。MSDN 页面的摘录(强调我的)
BOOL WINAPI MoveFileEx( _In_ LPCTSTR lpExistingFileName, _In_opt_ LPCTSTR lpNewFileName, _In_ DWORD dwFlags );
...
lpNewFileName [in, optional]
本地计算机上文件或目录的新名称。
...
如果 dwFlags 指定 MOVEFILE_DELAY_UNTIL_REBOOT 并且 lpNewFileName 为 NULL,则 MoveFileEx 注册 lpExistingFileName 文件以在系统重新启动时删除。
于 2017-03-29T12:55:42.197 回答