我的Windows程序通过目录/文件接口从另一个程序接收信息.那是其他程序将文件放入特殊目录.我的程序定期扫描目录,查找文件,进程然后删除它们.
我使用CreateFile()函数打开这样的文件.为了确保其他程序已完成写入文件并关闭它,我将dwShareMode参数设置为0.如果CreateFile因共享错误而失败,我只是跳过该文件直到下一次尝试.
问题是当我的程序打开文件时,DeleteFile()因ERROR_SHARING_VIOLATION错误而失败.
我可以在删除之前关闭文件,但我想避免在删除文件之前有其他程序打开文件的可能性.
我用这段代码打开文件
CreateFile(filePath,DELETE|FILE_READ_DATA,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
Run Code Online (Sandbox Code Playgroud)
是否有可能实现我想要的:打开文件然后删除它,以便其他程序不会干涉打开和删除文件.
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
Run Code Online (Sandbox Code Playgroud)
为 dwShareMode传入FILE_SHARE_DELETE。请注意,这仍然允许其他应用程序(以及您自己的应用程序)在您读取文件时调用DeleteFile(),但根据DeleteFile()的文档,直到您调用CloseHandle()关闭它才会被删除你的读句柄。
DeleteFile 函数将文件标记为在关闭时删除。因此,直到文件的最后一个句柄关闭后才会发生文件删除。后续调用 CreateFile 打开文件失败,并返回 ERROR_ACCESS_DENIED。
只要您不分别指定 FILE_SHARE_READ 或 FILE_SHARE_WRITE,其他应用程序将无法读取或写入该文件。虽然用FILE_SHARE_DELETE则可以移动文件,但仅此而已。
| 归档时间: |
|
| 查看次数: |
901 次 |
| 最近记录: |