Как эффективно дождаться разблокировки файла? - PullRequest
0 голосов
/ 20 декабря 2018

В моем коде потока мне нужно подождать, пока файл будет разблокирован, чтобы продолжить его обработку.

Файл потенциально заблокирован другим сторонним потоком (ами), которым я не могу управлять.

В настоящее время я использую этот код в моей теме:

...
while IsFileInUse(FileName) and not Terminated do
begin
  Sleep(100);
end;
// process the file

IsFileInUse код:

function IsFileInUse(const FileName: string): Boolean;
var
  Handle: HFILE;
begin
  Handle := CreateFile(PChar(FileName),
    GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := (Handle = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(Handle);
end;

Есть ли лучший и более эффективный способ избежать Sleep * * 1013

1 Ответ

0 голосов
/ 20 декабря 2018

Нет, нет API, который позволял бы получать уведомления, когда открытие файла становится возможным.Программы, которые отслеживают этот вид деятельности (например, ProcessMonitor), используют драйвер файловой системы ( ссылка ).

Хотя рассмотрите возможность отказаться от пробного открытия файла, поскольку это создает вероятность того, чтофайл снова становится недоступным между тестовым открытием и фактическим открытием для обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...