C ++ Lock File Windows Режим блокировки - PullRequest
3 голосов
/ 08 февраля 2012

Как заблокировать файл в Windows с помощью C ++ в режиме блокировки? Под блокировкой я имею в виду ... запрашивается блокировка, и если файл заблокирован, он будет ждать, пока он не будет разблокирован, как только файл разблокируется другим системным процессом, после чего выполнение возобновляется.

P.S .: Если есть какое-то кроссплатформенное решение, я бы предпочел его.

1 Ответ

3 голосов
/ 08 февраля 2012

По умолчанию LockFileEx блокируется до тех пор, пока блокировка не будет получена (хотя вы можете запретить это с помощью LOCKFILE_FAIL_IMMEDIATELY).

Очевидно, что это не кроссплатформенность.

Обновление

Этот ужасный пример кода показывает, что он работает (вам, вероятно, потребуется изменить имя файла в CreateFile с «lockBlock.cpp»).Запустите один экземпляр программы, и он получит блокировку.Запустите второй экземпляр, и он будет заблокирован.Нажмите в первом случае, чтобы снять блокировку, а второй экземпляр разблокируется и получит блокировку.

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;
}
...