我试图删除这些代码的行,我不知道我展示的代码是如何实现的最小行:
function read_file(FileName: String): AnsiString;
var
F: File;
Buffer: AnsiString;
Size: Integer;
ReadBytes: Integer;
DefaultFileMode: Byte;
begin
Result := '';
DefaultFileMode := FileMode;
FileMode := 0;
AssignFile(F, FileName);
Reset(F, 1);
if (IOResult = 0) then
begin
Size := FileSize(F);
while (Size > 1024) do
begin
SetLength(Buffer, 1024);
BlockRead(F, Buffer[1], 1024, ReadBytes);
Result := Result + Buffer;
Dec(Size, ReadBytes);
end;
SetLength(Buffer, Size);
BlockRead(F, Buffer[1], Size);
Result := Result + Buffer;
CloseFile(F);
end;
FileMode := DefaultFileMode;
end;
有没有办法减少更多的线?
答案 0 :(得分:6)
像这样:
function read_file(const FileName: String): AnsiString;
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
SetLength(Result, Stream.Size);
Stream.ReadBuffer(Pointer(Result)^, Stream.Size);
finally
Stream.Free;
end;
end;
在现代Delphi中,TFile
类具有静态方法,可以将其作为一个衬里。虽然没有直接进入AnsiString
。
除了缩短时,我还能感受到以下额外的好处:
如果必须使用Pascal I0执行此操作,请使用单个分配。
SetLength(Buffer, FileSize(F));
BlockRead(F, Pointer(Result)^, Length(Result), ReadBytes);
答案 1 :(得分:0)
如果你坚持使用旧式I / O,下面的函数可能是你能做的最小的函数,并且仍然适当地处理错误(如果适当处理错误就是返回一个空字符串)。
function read_file(const FileName: String): AnsiString;
var
F: File;
DefaultFileMode: Byte;
begin
DefaultFileMode := FileMode;
try
FileMode := 0;
AssignFile(F, FileName);
{$I-}
Reset(F, 1);
{$I+}
if IoResult=0 then
try
SetLength(Result,FileSize(F));
if Length(Result)>0 then begin
{$I-}
BlockRead(F,Result[1],LENGTH(Result));
{$I+}
if IoResult<>0 then Result:='';
end;
finally
CloseFile(F);
end;
finally
FileMode := DefaultFileMode;
end;
end;