Есть некое ПО, постоянно пишущее лог-файл своей работы.
Моя программа должна проанализировать этот лог-файл: найти определённые строки и вычленить из них информацию.
Удобно использовать TStrings. Но вот беда: процедура TStrings.LoadFromFile при обращении к нему вызывает исключение EFOpenError : Unable to open file. Насколько понимаю, потому что файл уже открыт другой программой.
Другими средствами этот же лог-файл открывается без проблем, например: FileOpen (logfile,fmOpenRead).
Пробовал устанавливать FileMode=fmOpenRead - не помогает.
Подскажите, пожалуйста, как можно решить данную проблему?
TStrings.LoadFromFile - как считать из уже открытого файла?
Модератор: Модераторы
...пришлось лезть в исходники:
Похоже, дело в том, что TStrings.LoadFromFile открывает файл, запрещая другим процессам писать в него: fmShareDenyWrite.
Предполагаю, что проблема должна решиться заменой fmShareDenyWrite на fmShareDenyNone.
Как это лучше сделать? Создать преемника MyTStrings, переопределив функцию LoadFromFile?
Код: Выделить всё
Procedure TStrings.LoadFromFile(const FileName: string);
Var
TheStream : TFileStream;
begin
TheStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(TheStream);
finally
TheStream.Free;
end;
end;Похоже, дело в том, что TStrings.LoadFromFile открывает файл, запрещая другим процессам писать в него: fmShareDenyWrite.
Предполагаю, что проблема должна решиться заменой fmShareDenyWrite на fmShareDenyNone.
Как это лучше сделать? Создать преемника MyTStrings, переопределив функцию LoadFromFile?
Очевидно, открой файл через T(File)Stream с нужным режимом и используй LoadFromStream.
