Конференция "WinAPI" » Заблокировать файл с помощью функций LockFile/LockFileEx [D7, WinXP]
 
  • apic (06.02.19 13:35) [0]
    Доброго времени суток! Нужна помощь умных людей. Нужно заблокировать и разблокировать файл с помощью функций 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?
 
Конференция "WinAPI" » Заблокировать файл с помощью функций LockFile/LockFileEx [D7, WinXP]
Есть новые Нет новых   [134427   +26][b:0][p:0.001]