首页 > 解决方案 > 如何有效地等待文件解锁?

问题描述

在我的线程代码中,我需要等待文件被解锁才能进一步处理它。

该文件可能被我无法控制的另一个外来线程锁定。

目前我在我的线程中使用此代码:

...
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?

标签: delphiwinapi

解决方案


不,没有 API 可以在打开文件时收到通知。监视此类活动的程序(例如 ProcessMonitor)使用文件系统驱动程序(链接)。

考虑放弃对文件的测试打开,因为它引入了文件在测试打开和实际打开处理之间再次变得不可用的可能性。


推荐阅读