Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Заблокировать файл с помощью функций LockFile/LockFileEx [D7, WinXP]


apic   (06.02.19 13:35

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


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо