在将一些代码从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函数?
答案 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块。