I'm migrating my application from delphi 2007 to delphi xe, but am having problems with a procedure which reads an ascii file and stores the content in a string.
This code worked in Delphi 2007
function LoadFileToStr(const FileName: TFileName): String;
var
FileStream : TFileStream;
begin
FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
if FileStream.Size>0 then
begin
SetLength(Result, FileStream.Size);
FileStream.Read(Pointer(Result)^, FileStream.Size);
end;
finally
FileStream.Free;
end;
end;
But when I execute this code in Delphi XE the result are just symbols like '????????'. I know that Delphi XE is unicode so I changed these lines
SetLength(Result, FileStream.Size);
FileStream.Read(Pointer(Result)^, FileStream.Size);
to
SetLength(Result, FileStream.Size*2);
FileStream.Read(Pointer(Result)^, FileStream.Size);
to store the content of the file in the unicode string but the result is the same.
how I can fix this procedure to read the content of this file?
you code does not work because you are reading the content of the file using a unicode string as buffer, so you are just moving bytes from the internal buffer of the TFileStream to the unicode string ignoring the encoding.
you can fix easily your procedure , just changing the result type to AnsiString
function LoadFileToStr(const FileName: TFileName): AnsiString;
but i will recommend you which you use the TFile.ReadAllText
function instead which in a single line of code read the content of a file a also handle the encoding of the file.