如何在delphi XE中读取文件内容到字符串

时间:2011-05-23 23:46:00

标签: delphi delphi-2007 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);
      FileStream.Read(Pointer(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?

4 个答案:

答案 0 :(得分:26)

您的代码不起作用,因为您正在使用unicode字符串作为缓冲区读取文件的内容,因此您只是将字节从TFileStream的内部缓冲区移动到忽略编码的unicode字符串。

您可以轻松修复您的程序,只需将结果类型更改为AnsiString

即可
function LoadFileToStr(const FileName: TFileName): AnsiString;

但我会建议您使用TFile.ReadAllText函数,而不是在一行代码中读取文件的内容,也处理文件的编码。

答案 1 :(得分:11)

您可以使用ReadAllText函数通过一行代码实现此目的。像这样:

Uses IOUtils;

TFile.ReadAllText(FileName);
TFile.ReadAllText(FileName, s, TEncoding.ASCII) // force encoding 

它将正确检测ANSI,Unicode和二进制文件。 (现在我看到RRuz已经推荐了相同的内容)。

答案 2 :(得分:8)

您应该考虑编码,例如:

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;

答案 3 :(得分:6)

我建议使用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后代加载,则将LoadFromFile替换为LoadFromStream。