正在删除 运行 个文件
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.
当我使用最新版本的 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.