Здесь сообщение об ошибке на самом деле немного вводит в заблуждение.Причина, по которой вы не можете загрузить в список строк, заключается в том, что вы уже открыли файл для чтения / записи.
, если вы проверяете реализацию TStrings.LoadfromFile:
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;
Вы видите, чтоон пытается открыть файл с условием «DenyWrite», но вы уже открыли файл в режиме записи.По этой причине происходит сбой.
Вы можете обойти это, используя вместо этого LoadFromStream.
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try
Stringlist.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
Обратите внимание, что вам потребуется использовать fmShareDenyNone, чтобы это работало в такой ситуации.С другой стороны, вы могли бы, вероятно, повторно использовать дескриптор чтения / записи, полученный из вашего OpenFile, возможно, сделать что-то вроде этого:
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
iPosition : Int64;
begin
Stream := THandleStream.Create(FHandle); //FHandle is the read/write handle returned by OpenFile
try
iPosition := Stream.Position;
Stream.Seek(0, soFromBeginning);
Stringlist.LoadFromStream(Stream);
Stream.Position := iPosition;
//Restore stream position.
finally
Stream.Free;
end;
end;
Но учтите, что в этом подходе может быть несколько "недоразумений", которых я не знаюиз.