2011-11-18 72 views
2

,我使用GENERIC_READ | 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);lockfileex不会停止create_always在一个进程中删除文件

它删除了文件的内容。当我的其他程序将文件锁定(仅限于)时,不应该无法做到这一点吗?

我希望其他进程能够获取文件句柄(这就是为什么我使用file_share标志),但我认为他们无法改变文件,而另一个进程锁定它,所以我正在做一些事情像

的CreateFile lockfileex

和具有它lockfileex阻塞,直到其他文件释放锁。这只是我或是msft的行为在这里错了吗?

回答

3

当您尝试使用CREATE_ALWAYS打开文件时,Windows 是否应该承诺文件锁定值得商榷,但是从笔记中显示它没有。防止其他进程写入已打开的文件的最佳方法是不要在独占进程中指定FILE_SHARE_WRITE。

但是,这不会给你等待从文件锁实现没有轮询的行为。无法打开具有独占访问权限的文件,并且没有任何其他文件试图打开它,直到具有独占访问权限的进程放弃该访问权限。

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

作为一个方面说明,只有将区域从0字节锁定到UINT_MAX才会提供互斥,例如,如果进程打开文件并尝试写入位于UINT_MAX + 1的位置(刚刚超过4GB点)。