delphi - 如何有效地等待文件解锁?
问题描述
在我的线程代码中,我需要等待文件被解锁才能进一步处理它。
该文件可能被我无法控制的另一个外来线程锁定。
目前我在我的线程中使用此代码:
...
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
?
解决方案
不,没有 API 可以在打开文件时收到通知。监视此类活动的程序(例如 ProcessMonitor)使用文件系统驱动程序(链接)。
考虑放弃对文件的测试打开,因为它引入了文件在测试打开和实际打开处理之间再次变得不可用的可能性。
推荐阅读
- ruby-on-rails - Rails 组方法在 Postgres 中输出错误的平均值
- r - Using rvest to login on web
- wso2-am - 从 WSO2 APIM 到端点的自定义消息
- jquery - 使用 laravel 以模态方式传递数据
- reactjs - 如何在搜索中 e.target 不是每个人的符号?
- c# - invalid column name , parameter from c#
- c - 如何打印每个进程的pid?
- node.js - 从 Firestore 获取异步值
- python - 让 Pandas 找出在 pd.read_excel 中要跳过的行数
- ruby-on-rails - 如何使用 Rspec 知道控制器方法的流程