在我的线程代码中,我需要等待文件被解锁才能对其进行进一步处理。
该文件可能已被另一个我无法控制的外来线程锁定。
当前,我在线程中使用以下代码:
...
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
?
答案 0 :(得分:4)
否,没有可以打开文件时被通知的API。监视此类活动的程序(例如ProcessMonitor)使用文件系统驱动程序(link)。
但是请考虑放弃文件的测试开口,因为这可能会导致文件在测试开口和实际开口之间再次变得不可用进行处理。