lockfileex不会阻止create_always擦除文件

时间:2011-11-18 21:13:48

标签: windows locking

在一个过程中,我使用GENERIC_READ |调用createfile GENERIC_WRITE,FILE_SHARE_READ |参数的FILE_SHARE_WRITE,OPEN_ALWAYS和FILE_ATTRIBUTE_NORMAL。 然后我在整个文件上调用了LockFileEx。我获得了一个独占锁,并从0区锁定到UINT_MAX。

之后,在另一个进程中,我调用:: CreateFileW(path.c_str(),perms,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

它删除了文件的内容。当我的其他人保持文件锁定(专属)时,不应该不能这样做吗?

我希望其他进程能够获取文件的句柄(这就是我使用file_share标志的原因),但我认为他们根本无法更改文件,而另一个进程锁定它,所以我做了类似的事情

的CreateFile lockfileex

让它在lockfileex上阻塞,直到另一个文件释放锁。这只是我还是msft的行为在这里错了?

1 个答案:

答案 0 :(得分:3)

当您尝试使用CREATE_ALWAYS打开文件时,Windows 是否应该尊重文件锁是有争议的,但是从您的笔记中看出它没有。防止其他进程写入您已打开的文件的最佳方法是不在您的独占进程中指定FILE_SHARE_WRITE。

但是,这不会为您提供在没有轮询的情况下从文件锁实现中获得的等待行为。无法打开具有独占访问权限的文件,并且有任何其他尝试打开它的文件等到具有独占访问权限的进程放弃该访问权限。

如果您可以访问所涉及的所有进程的源,那么您可以让尝试截断文件的进程首先在区域上调用LockFileEx,然后在获取锁之后调用SetFileSize。

作为旁注,仅将区域从0字节锁定到UINT_MAX将不会提供互斥,例如,如果进程打开文件并尝试写入UINT_MAX + 1处的位置(刚好超过4GB点)