我的Windows程序通过目录/文件界面从另一个程序接收信息。 那是其他程序将文件放入特殊目录。我的程序定期扫描目录,查找文件,进程然后删除它们。
我使用CreateFile()函数打开这些文件。为了确保其他程序已完成写入文件并关闭它,我将dwShareMode参数设置为0.如果CreateFile因共享错误而失败,我只是跳过该文件直到下一次尝试。
问题是当我的程序打开文件时,DeleteFile()因ERROR_SHARING_VIOLATION错误而失败。
我可以在删除之前关闭文件,但我想避免在删除文件之前有其他程序打开文件的可能性。
我使用此代码打开文件
CreateFile(filePath,DELETE|FILE_READ_DATA,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
是否有可能达到我想要的效果:只打开文件然后将其删除,这样其他程序就无法在打开和删除文件之间产生干扰。
答案 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然后可以移动文件,但那就是它。