Доброго времени суток! Нужна помощь умных людей. Нужно заблокировать и разблокировать файл с помощью функций LockFile/LockFileEx и UnlockFile/UnlockFileEx. Но при блокировке может оказаться, что файл уже заблокирован этими функциями в другом процессе и нужно ожидать пока он освободится, что бы заблокировать. Я написал какое-то подобие того, что мне нужно, и оно даже вроде работает, но сомневаюсь в правильности кода. И я написал блокировку файла с помощью функции LockFile, а для моего случая, когда требуется ждать своей очереди, лучше подойдет, как я понял, функция LockFileEx, но я не знаю как ей пользоваться и не могу найти полноценного примера в сети. Вот мои 2 функции:
function LockFileSection(const FileName: String; const Offset, Length: Int64; const Wait: Boolean): THandle;
var
Failed, LockResult: Boolean;
begin
Result := 0;
Failed := False;
FileHandle:=CreateFile(
PChar(FileName),
GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0
);
if FileHandle = INVALID_HANDLE_VALUE then
begin
Exit;
end;
repeat
LockResult := LockFile(
FileHandle,
Int64Rec(Offset).Lo,
Int64Rec(Offset).Hi,
Int64Rec(Length).Lo,
Int64Rec(Length).Hi
);
if not LockResult and Wait then
begin
if (GetLastError() = ERROR_LOCK_VIOLATION) then
Sleep(10)
else
begin
Failed := True;
CloseHandle(FileHandle);
end;
end else if LockResult then Result:= FileHandle;
until LockResult or not Wait or Failed;
end;
function UnlockFileSection(const FileHandle: THandle; const Offset, Length: Int64): Boolean;
begin
Result := UnlockFile(
FileHandle,
Int64Rec(Offset).Lo,
Int64Rec(Offset).Hi,
Int64Rec(Length).Lo,
Int64Rec(Length).Hi
);
end;
Может кто нибудь прокомментировать, вполне ли это адекватный код, правильно ли вызываю CreateFile, LockFile, UnlockFile и как пример можно переделать на использование LockFileEx и UnlockFileEx?