减少函数中的代码行以读取 Delphi 中的文件

Reduce lines of code in function to read files in Delphi

我正在尝试削减这段代码的行数,但我看不出我显示的代码是如何实现的最少行数:

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;

有什么办法可以减少更多行吗?

像这样:

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 class 具有静态方法,可以将其作为单行代码执行此操作。虽然没有直接变成AnsiString

除了变短之外,我还发现了以下额外好处:

  1. 避免使用 Pascal I/O 以支持现代流。
  2. 异常错误处理,由流处理class。
  3. 字符串变量的单次分配与重复低效的重新分配相反。

如果您必须使用 Pascal I0 执行此操作,请使用单个分配。

SetLength(Buffer, FileSize(F));
BlockRead(F, Pointer(Result)^, Length(Result), ReadBytes);

如果您坚持使用旧式 I/O,下面的函数可能是您可以做的最小的函数,并且仍然可以适当地处理错误(如果适当地处理错误是 return 一个空字符串).

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;