使用打开的句柄删除文件
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 了解更多详情。
【讨论】:
以上是关于使用打开的句柄删除文件的主要内容,如果未能解决你的问题,请参考以下文章