Delphi 2010是否具有LoadTextFromFile功能?

时间:2010-08-15 10:50:13

标签: delphi delphi-2010

在将一些代码从Delphi 7移植到Delphi 2010时,我正在重写我的LoadTextFromFile()函数。

function LoadTextFromFile(const aFullFileName: string): string;
var
  lBuffer:     TBytes;
  lEncoding:   TEncoding;
  lFileStream: TFileStream;
  lSize:       Integer;

begin

  if not FileExists(aFullFileName) then
  begin
    raise Exception.Create('File "' + aFullFileName + '" not found.');
  end;

  lFileStream := TFileStream.Create(aFullFileName, fmOpenRead + fmShareDenyNone);
  try

    if lFileStream.Size <= 0 then
    begin
      Result := '';
    end
    else
    begin

      lSize := lFileStream.Size - lFileStream.Position;

      SetLength(lBuffer, lSize);

      // Read file into TBytes buffer
      lFileStream.Read(lBuffer[0], lSize);

      // Read encoding from buffer
      TEncoding.GetBufferEncoding(lBuffer, lEncoding);

      // Get string from buffer
      Result := lEncoding.GetString(lBuffer);

    end;

  finally
    lFileStream.Free;
  end;

end;

当一个想法触及我的脑袋时:标准库中必定有这样的东西。许多用户想要将文本文件读入字符串,但我找不到这样的标准函数。我最接近的是使用TStringlist加载文本。但是A)创建一个TStringlist看起来没必要,B)我不想承受TStringlist的开销。

问题:Delphi 2010中是否有标准的LoadTextFromFile函数?

4 个答案:

答案 0 :(得分:14)

是的,在Delphi 2010中存在一个类似于ReadAllText的函数,它是TFile单元中声明的IOUtils记录的一部分。

检查此声明

class function ReadAllText(const Path: string): string; overload; inline; static;
class function ReadAllText(const Path: string; const Encoding: TEncoding): string; overload; inline; static;

参见此示例

program Project80;

{$APPTYPE CONSOLE}

uses
  IOUtils,
  SysUtils;
Var
 Content : string;
begin
  try
    Content:=TFile.ReadAllText('C:\Downloads\test.css'); //load the text of the file in a single line of code
    //Content:=TFile.ReadAllText('C:\Downloads\test.css',TEncoding.UTF8); //you can an encoding too.
    Writeln(Content);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

答案 1 :(得分:4)

TStringStream.LoadFromStream / file?无论如何,非常大的字符串总是有点浪费。你必须非常小心,不要不小心复制它。

答案 2 :(得分:2)

我尝试了相同的解决方案,但是使lEncoding成为一个类变量以使其持久化,因此我将文件保存为与读取时相同的编码。但是,如果已将GetBufferEncoding设置为某些内容(如果读取了上一个文件,那么)lEncoding的调用不执行任何操作。所以,首先我尝试释放它,这导致了整个地方的访问冲突。现在我只是在进行第二次调用之前将其设置为nil,它似乎有效。

这样的事情:

if Assigned(lEncoding) then begin
  lEncoding := nil;
end;
GetBufferedEncoding(buffer, lEncoding);

答案 3 :(得分:1)

快速方法是TStringList.LoadFromFile()。然后使用TStringlist.Text将数据作为一个大字符串进行访问。不要忘记创建/免费,理想情况下使用try..finally块。