How read the content of file to a string in delphi XE
You should take encoding into account, for example:
function LoadFileToStr(const FileName: TFileName): String;
var
FileStream : TFileStream;
Bytes: TBytes;
begin
Result:= '';
FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
if FileStream.Size>0 then begin
SetLength(Bytes, FileStream.Size);
FileStream.Read(Bytes[0], FileStream.Size);
end;
Result:= TEncoding.ASCII.GetString(Bytes);
finally
FileStream.Free;
end;
end;
//test
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(LoadFileToStr('C:\autoexec.bat'));
end;
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.
I recommend using a TStringList to load the content of the file and then set the result to variable.Text, for example:
function LoadFileToStr(const FileName: TFileName): String;
var LStrings: TStringList;
begin
LStrings := TStringList.Create;
try
LStrings.Loadfromfile(FileName);
Result := LStrings.text;
finally
FreeAndNil(LStrings);
end;
end;
In this way you don't have to worry about anything, it will be backwards and future compatible IMHO.
EDIT: If you need to load from a TStream descendant, then replace LoadFromFile with LoadFromStream.
You can achieve this with one line of code using ReadAllText function. Like this:
Uses IOUtils;
TFile.ReadAllText(FileName);
or
TFile.ReadAllText(FileName, s, TEncoding.ASCII) // if you want to force ASCII (other) encoding
It will correctly detect ANSI, Unicode and binary files.