我试图将会话日志从其他应用程序(Proxifier)记录到备忘录.我试过使用命令:
procedure TForm1.TimerTimer(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('C:\PMASSH\Proxyfier\Profiles\Log.txt');
end;
Run Code Online (Sandbox Code Playgroud)
但在某些时候我得到一个错误

你能解决我上面的问题吗?我真的很感激所有的答案.
谢谢
另一个程序使用共享模式打开文件,该模式不允许其他进程读取它.通常,当其他应用程序写入文件时会发生这种情况.
你可以做很多事情.这是完全正常的行为,是可以预期的.您可以尝试检测错误,等待一段时间,然后重新尝试.
由于您已在计时器上运行此功能,因此将重新尝试.所以也许你只需要压制这些例外:
procedure TForm1.TimerTimer(Sender: TObject);
begin
try
Memo1.Lines.LoadFromFile(...);
except
on EFOpenError do
; //swallow this error
end;
end;
Run Code Online (Sandbox Code Playgroud)
请注意,检测EFOpenError可能有点粗糙.也许还有其他失败模式导致该错误.但是,作为第一遍,上面的代码是一个不错的开始.
大卫的回答是正确的.我只想澄清为什么会这样.
答案在于代码:
procedure TStrings.LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如您所见,访问该文件以进行共享,但不允许写入.你可以通过自己创建文件流来解决这个问题:
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
Run Code Online (Sandbox Code Playgroud)
然后使用该Lines.LoadFromStream()方法将内容加载到备忘录中
请注意,如果其他应用程序以独占模式打开文件(即没有共享),则问题可能存在,因此仍需要像David的答案那样正确的异常管理.
| 归档时间: |
|
| 查看次数: |
7510 次 |
| 最近记录: |