在一个进程中,我用GENERIC_READ |调用了createfile GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,OPEN_ALWAYS和FILE_ATTRIBUTE_NORMAL作为参数。 然后我在整个文件上调用LockFileEx。 我获得了排他锁,并从范围0locking到UINT_MAX。
之后,在另一个进程中,我调用:: CreateFileW(path.c_str(),perms,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
并删除了文件的内容。 不应该不能这样做,而我的另一个prcoess文件locking(专门)?
我希望其他进程能够获得文件句柄(这就是为什么我使用file_share标志),但我认为他们不能改变文件,而另一个进程locking它,所以我做了像
创build文件lockfileex
并让它锁在lockfileex上,直到另一个文件释放锁。 这只是我或是msft的行为在这里错了吗?
在尝试使用CREATE_ALWAYS打开文件时,Windows是否应该遵守文件锁定值得商榷,但从笔记中可以看出它没有。 防止其他进程写入已打开的文件的最佳方法是不要在您的独占进程中指定FILE_SHARE_WRITE。
但是,这不会给你没有轮询的文件锁实现的等待行为。 没有办法打开具有独占访问权限的文件,并且有任何其他文件试图打开它,等待具有独占访问权限的进程放弃该访问权限。
如果您有权访问涉及的所有进程的源,那么您可以让正在尝试截断文件的进程首先调用某个区域上的LockFileEx,然后在获取该锁之后调用SetFileSize。
作为一个方面说明,如果某个进程打开文件并尝试写入UINT_MAX + 1(刚刚超过4GB点)的位置,只将区域从0字节锁定到UINT_MAX将不会提供互斥。