使用打开的句柄删除文件

Posted

技术标签:

【中文标题】使用打开的句柄删除文件【英文标题】:Deleting a file with an open Handle 【发布时间】:2012-04-25 11:21:03 【问题描述】:

我应该不能删除带有打开句柄的文件,对吗?所以我创建了一个文件,然后我立即尝试删除它,希望这会失败。还是我错了,在删除文件之前不必关闭句柄?

HANDLE hFile = CreateFile (TEXT(file),      
                  GENERIC_WRITE,          
                  0,                      
                  NULL,                   
                  OPEN_ALWAYS,          
                  FILE_ATTRIBUTE_NORMAL,  
                  NULL);                  

if (hFile == INVALID_HANDLE_VALUE)

    //FAIL


if(DeleteFile(file))

    //Should it ever get here cos i dont close the handle?

【问题讨论】:

这个问题是特定于操作系统/库的吗?然后相应地标记。 根据文档,句柄可以打开,也将保持可写状态,直到关闭。我相信所有基于 posix 的系统都是如此。 【参考方案1】:

这取决于文件的打开方式。如果共享模式指定了FILE_SHARE_DELETE,则可能被其他人删除。

即使您对文件进行内存映射,并且已使用此标志打开它(以及读/写共享),那么它仍然可以被 shell 删除(至少我已经尝试过并且它发生了,但也许该文件已简单地重命名并移至回收站)。在这种情况下,随后访问内存将导致“InPageError”C 样式异常。

【讨论】:

【参考方案2】:

是的,它会失败。

如果应用程序尝试删除某个文件,DeleteFile 函数将失败 为普通 I/O 或作为内存映射文件打开的文件。

【讨论】:

【参考方案3】:

你试过了吗? MS 文档指出:

如果应用程序尝试删除为正常 I/O 打开的文件或作为内存映射文件打开的文件,DeleteFile 函数将失败。

因此,如果您没有得到这种行为,我建议您打开文件的方式。您确定您对文件是否打开的检查是完全全面的吗?您是否尝试过先写入文件?你能在你自己的代码之外看到这个文件吗? (即来自 Explorer)查看here 了解更多详情。

【讨论】:

以上是关于使用打开的句柄删除文件的主要内容,如果未能解决你的问题,请参考以下文章

逆向对抗技术之ring3解除文件句柄,删除文件

Windows 11删除正在被程序占用的文件夹

lsof恢复进程打开的文件

linux删除文件后空间无法释放?lsof没有结果。重启无效。请问各位高手还有别的办法吗?

windows10强制删除文件命令

docker挂载文件删除容器内文件句柄不释放