C ++锁定文件Windows阻止模式

时间:2012-02-08 00:40:07

标签: c++ windows visual-c++ blocking lockfile

如何以阻塞的方式使用C ++阻止Windows上的文件?通过阻止我的意思是......请求锁定,如果文件被锁定,它将等待它解锁,一旦文件被另一个系统进程解锁而不是执行恢复。

P.S。:如果有某种跨平台解决方案我更喜欢它。

1 个答案:

答案 0 :(得分:3)

默认情况下,LockFileEx会阻止,直到可以获取锁定为止(尽管你可以告诉它不要使用LOCKFILE_FAIL_IMMEDIATELY)。

显然,这不是跨平台的。

<强>更新

这个可怕的代码示例说明它有效(您可能需要在“lockBlock.cpp”中更改CreateFile中的文件名)。运行程序的一个实例,它将获得锁定。运行第二个实例,它将阻止。按&lt; enter&gt;在第一个实例中释放锁定,第二个实例将解锁并获取锁定。

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hFile = ::CreateFileA("lockBlock.cpp", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    OVERLAPPED overlapped;
    memset(&overlapped, 0, sizeof(overlapped));
    const int lockSize = 10000;
    printf("Taking lock\n");
    if (!LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, lockSize, 0, &overlapped))
    {
        DWORD err = GetLastError();
        printf("Error %i\n", err);
    }
    else
    {
        printf("Acquired lock\n");
        getchar();
        UnlockFileEx(hFile, 0, lockSize, 0, &overlapped);
        printf("Released lock\n");
    }
    return 0;
}