使用打开的句柄删除文件

时间:2012-04-25 11:21:03

标签: c++ file winapi

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

是的,它会失败。

  

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

答案 2 :(得分:0)

你试过这个吗? MS文档声明:

  

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

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