删除在同一进程中为独占访问权限打开的文件

时间:2011-07-31 20:40:58

标签: windows winapi

我的Windows程序通过目录/文件界面从另一个程序接收信息。 那是其他程序将文件放入特殊目录。我的程序定期扫描目录,查找文件,进程然后删除它们。

我使用CreateFile()函数打开这些文件。为了确保其他程序已完成写入文件并关闭它,我将dwShareMode参数设置为0.如果CreateFile因共享错误而失败,我只是跳过该文件直到下一次尝试。

问题是当我的程序打开文件时,DeleteFile()因ERROR_SHARING_VIOLATION错误而失败。

我可以在删除之前关闭文件,但我想避免在删除文件之前有其他程序打开文件的可能性。

我使用此代码打开文件

CreateFile(filePath,DELETE|FILE_READ_DATA,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)

是否有可能达到我想要的效果:只打开文件然后将其删除,这样其他程序就无法在打开和删除文件之间产生干扰。

2 个答案:

答案 0 :(得分:6)

FILE_FLAG_DELETE_ON_CLOSE可能就是你要找的东西。来自MSDN

* FILE_FLAG_DELETE_ON_CLOSE 0x04000000 - 在关闭所有句柄后立即删除该文件,其中包括指定的句柄和任何其他打开或重复的句柄。 如果文件存在打开的句柄,则调用将失败,除非它们都是使用FILE_SHARE_DELETE共享模式打开的。 除非指定了FILE_SHARE_DELETE共享模式,否则对文件的后续打开请求将失败。*

编辑:添加了一个例子......

所以,在你的情况下你应该:

HANDLE hFile = ::CreateFile(filePath,
                DELETE|FILE_READ_DATA,
                0,
                NULL,
                OPEN_EXISTING,
                FILE_FLAG_DELETE_ON_CLOSE,
                NULL);

//use the file...

::CloseHandle(hFile); //the file gets deleted when the handle is closed

答案 1 :(得分:4)

传递FILE_SHARE_DELETE dwShareMode。请注意,这仍然允许其他应用程序(以及您自己的应用程序)在您读取文件时调用DeleteFile(),但根据DeleteFile()的文档,在调用CloseHandle()之前不会删除它关闭你的阅读句柄。

  

DeleteFile函数在关闭时标记要删除的文件。因此,   直到文件的最后一个句柄是,才会发生文件删除   关闭。随后调用CreateFile以打开文件失败   ERROR_ACCESS_DENIED。

只要您未分别指定FILE_SHARE_READ或FILE_SHARE_WRITE,其他应用程序将无法读取或写入文件。虽然使用FILE_SHARE_DELETE然后可以移动文件,但那就是它。