Delphi 2010是否有LoadTextFromFile函数?

Delphi 2010是否有LoadTextFromFile函数?,delphi,delphi-2010,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 FileExis

在将一些代码从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;
函数LoadTextFromFile(const aFullFileName:string):string;
变量
lBuffer:TBytes;
lEncoding:TEncoding;
lFileStream:TFileStream;
lSize:整数;
开始
如果文件不存在(aFullFileName),则
开始
引发异常。创建('File'+aFullFileName+'“未找到”);
结束;
lFileStream:=TFileStream.Create(一个完整的文件名,fmOpenRead+fmsharedynone);
尝试

如果lFileStream.SizeTStringStream.LoadFromStream/file?无论如何,非常大的字符串总是有点浪费。您必须非常小心,不要意外地复制它。

是的,存在一个类似Delphi 2010中的函数,它被调用,并且是
IOUtils
单元中声明的
t文件
记录的一部分

检查这个声明

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.

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

我尝试了相同的解决方案,但将
lEncoding
作为类变量以使其持久化,因此我会在读取文件时将文件保存为相同的编码。但是,如果
lEncoding
已设置为某个值(如果读取了上一个文件),则对
GetBufferEncoding
的调用不会执行任何操作。所以,首先我尝试释放它,这导致了各地的访问违规。现在我只是在打第二个电话之前把它设为零,它似乎起作用了

大概是这样的:

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

这种方法需要文件大小的许多倍,我不建议对大文件使用这种方法。谢谢,这正是我想要的。出于好奇:当IOUtils和TFile添加到Delphi中时,我注意到TFile.ReadAllText在读取文件时对其设置了独占锁。我更喜欢FmSharedyWrite锁。即使在Delphi7中,您也不必这么做。使用
TStringStream
而不是
TFileStream
,并使用Marco的答案。另外,我很好奇:在什么情况下,您发现创建流后,
Position
属性不会立即为零,因此您需要从
Size
中减去它才能计算
lSize
?嗨,Rob,在Delphi 7中,我必须能够加载/保存到UTF8文件。更重要的是,我不知道TStringStream。这个职位不需要在那里。它之所以存在,是因为我从TStrings.Loadfromstream方法中复制了一些代码,该方法中有位置。我的代码中还有另一个bug,因为它不能处理带有BOM的文件。所以任何想用我的例子的人:不要。改用TFile.ReadAllText。