如何在delphi XE中将文件的内容读取为字符串

问题描述

| 我正在将应用程序从delphi 2007迁移到delphi xe,但是我在读取文件(ascii)并将内容存储在字符串中的过程中遇到问题 这是在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;
但是当在delphi XE中执行此代码时,结果只是像\'???????? \'这样的符号,我知道哪个delphi xe是unicode,所以我更改了这些行
      SetLength(Result,FileStream.Size);
      SetLength(Result,FileStream.Size*2);
      FileStream.Read(Pointer(Result)^,FileStream.Size);
文件内容存储在unicode字符串中,但结果是相同的。
how i can fix this procedure to read the content of this file?
    

解决方法

您的代码不起作用,因为您正在使用unicode字符串作为缓冲区读取文件的内容,因此您只是将字节从TFileStream的内部缓冲区移至unicode字符串,而忽略了编码。 您可以轻松地解决您的程序,只需将结果类型更改为
AnsiString
function LoadFileToStr(const FileName: TFileName): AnsiString;
但是我建议您使用
TFile.ReadAllText
函数,而不是在单行代码中读取文件内容,还可以处理文件的编码。     ,您可以使用ReadAllText函数用一行代码来实现。像这样:
Uses IOUtils;

TFile.ReadAllText(FileName);
TFile.ReadAllText(FileName,s,TEncoding.ASCII) // force encoding 
它将正确检测ANSI,Unicode和二进制文件。     ,您应该考虑编码,例如:
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;
    ,我建议使用TStringList加载文件的内容,然后将结果设置为variable.Text,例如:
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;
这样,您不必担心任何事情,它会向后并兼容将来的恕我直言。 编辑:如果您需要从TStream子孙中加载,则用LoadFromStream替换LoadFromFile。