正在删除 运行 个文件

Deleting running files

当我使用最新版本的 McAfee Antivirus 时,我注意到粉碎功能可以删除 运行 个文件,然后要求您重新启动计算机。有谁知道它如何在不关闭文件的情况下删除 运行 个文件?

这可能取决于 OS 和文件系统类型。在 Linux 和类似 Unix 上,删除文件只是从文件夹中删除一个条目。如果没有文件夹条目指向该文件,则该文件实际上在上次关闭时被删除。所以你可以安全地删除一个文件,即使它是在另一个进程中打开的。

在 Windows 上 MSDN 说:

The DeleteFile function fails if an application attempts to delete a file that has other handles open for normal I/O or as a memory-mapped file

常用技巧包括:

  • 尝试关闭所有拥有该文件句柄的进程。对于可执行文件,它通常意味着终止其所有实例
  • 将文件标记为在下次重新启动时删除。正如您所说,McAfee 要求重新启动计算机,它可能会使用该选项。 MoveFileEx WINAPI 函数对此有规定。摘自 MSDN page(强调我的)
BOOL WINAPI MoveFileEx(
  _In_     LPCTSTR lpExistingFileName,
  _In_opt_ LPCTSTR lpNewFileName,
  _In_     DWORD   dwFlags
);

...
lpNewFileName [in, optional]
The new name of the file or directory on the local computer.
...
If dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts.