Блокирование участков файлов
Так как ОС разрешает одновременную работу с файлом нескольких приложений, может возникнуть необходимость блокирования участка файла на некоторый промежуток времени.
Функции LockFile и LockFileEx блокируют заданный участок файла. При обращении к заблокированной области для чтения или записи – всегда ошибка..
Функция LockFileEx даже позволяет указать, особые свойства блокирования. (exclusive)
блокирование запрещает полный доступ всем процессам, в том числе и чтение, и запись. (shared) блокирование запрещает только запись. Это позволяет определить в файле область только для чтения.
Для разблоктрования области используются функции UnlockFile
или UnlockFileEx. Приложение должно разблокировать все области файла перед его закрытием
Функция LockFileEx блокирует участок окрытого файла, задавая shared или exclusive доступ.
BOOL LockFileEx(
HANDLE hFile, // Дескриптор файла
DWORD dwFlags, // Флаги
DWORD dwReserved, // Резерв, 0
DWORD nNumberOfBytesToLockLow, // младшие 32 бита длины //области блокирования
DWORD nNumberOfBytesToLockHigh, // старшие 32 бита длины
// области блокирования
LPOVERLAPPED lpOverlapped // Адрес стрктуры с оределением //области блокирования
);
Значения флагов:
LOCKFILE_FAIL_IMMEDIATELY Если это значение установлено и немедленно нельзя заблокировать заданный участок – сразу ошибка, иначе ждет возможности.
LOCKFILE_EXCLUSIVE_LOCK Блокирование типа exclusive. Иначе типа shared.
Структура содержит значение смещения для блокируемого участка (поля Offset, OffsetHigh).
typedef struct _OVERLAPPED { // o
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED;
Функция UnlockFileEx разблокирует заблокированную область открытого файла.
BOOL UnlockFileEx(
HANDLE hFile, // Дескриптор
DWORD dwReserved, // Резерв, 0
DWORD nNumberOfBytesToUnlockLow, // Младшие 32 бита
DWORD nNumberOfBytesToUnlockHigh, // Старшие 32-бита
LPOVERLAPPED lpOverlapped // Адрес структуры со смещением
);