删除具有打开句柄的文件

Deleting a file with an open Handle

本文关键字:句柄 文件 删除      更新时间:2023-10-16

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

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?
}

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

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

是的,它会失败。

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

你试过这个吗?MS 文档指出:

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

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