0

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

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

3 回答 3

2

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

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

于 2012-04-25T11:43:12.490 回答
0

是的,它会失败。

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

于 2012-04-25T11:25:32.440 回答
0

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

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

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

于 2012-04-25T11:32:30.860 回答