Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.02.2019, 13:32
frkbvfnjh frkbvfnjh вне форума
Прохожий
 
Регистрация: 18.10.2011
Сообщения: 10
Репутация: 10
По умолчанию Заблокировать файл с помощью функций LockFile/LockFileEx

Доброго времени суток! Нужна помощь умных людей. Нужно заблокировать и разблокировать файл с помощью функций 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?
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter