LockFileEx返回成功,但似乎没有效果

时间:2014-05-28 08:21:44

标签: windows file-io mutex

我正在尝试锁定文件,因为它位于网络驱动器上,并且来自多台计算机的多个程序实例需要对其进行编辑。为了防止损坏,我打算进行设置,以便一次只有一个实例拥有权限。

我实现了一个锁,理论上可以从任何访问中锁定文件的前100个字节。我正在使用Qt自己的文件处理,但它有一个返回通用文件句柄的方法。

QFile file(path);
HANDLE handle = (HANDLE)_get_osfhandle(file.handle());
OVERLAPPED ov1;
memset(&ov1, 0, sizeof(ov1));
ov1.Offset = 0;
ov1.OffsetHigh = 0;
if (handle == INVALID_HANDLE_VALUE)
{
    // error
    return;
}

LockFileEx(handle, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0, 100, 0, &ov1);
qDebug() << file.readLine();

LockFileEx()返回1,因此似乎已成功。但是,如果我在多个实例中运行程序,它们都可以读取并打印文件的第一行。除此之外,我可以使用任何文本编辑器自由编辑文件。 作为网络文件不是问题,因为它与本地文件的行为类似。

1 个答案:

答案 0 :(得分:1)

问题在于,虽然程序没有终止,但QFile变量是本地的,所以在完成该函数后,QFile的析构函数被调用,因此它释放了该文件。操作系统似乎已经解除了锁定。

如果我的QFile在范围内存活,那么一切正常。一个小问题是,虽然我期望文件被锁定以防止读取,但外部程序确实具有对它的只读访问权限。这不是问题,因为我的程序可以检查它是否可以创建锁,并检测不能这样做。这意味着预期的互斥锁功能可以正常工作。