2012-02-08 1 views
3

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

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

+0

Вы действительно хотите заблокировать файл или просто пытаетесь синхронизировать процессы? Если последний, то вы можете использовать глобальный мьютекс (т. Е. Использовать один и тот же параметр 'lpName' при вызове' CreateMutex' в разных процессах). –

ответ

3

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

Очевидно, что это не межплатформенная платформа.

Update

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

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; 
} 
+0

Я сделал «игрушечный пример», уже использующий LockFileEx, и, похоже, он не блокируется, хотя я не LOCKFILE_FAIL_IMMEDIATELY. Что странно ... если бы это сработало, я бы поставил правильный ответ. – petersaints

+0

@petersaints: Вы используете асинхронный ввод-вывод? – arx

+0

Нет. Должен ли я? Кажется, это немного сбивает с толку то, что я читал в документации. И это похоже на то, что я ожидаю от асинхронного ввода-вывода (из описания). – petersaints