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

时间:2015-02-22 14:13:37

标签: 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;

有没有办法减少更多的线?

2 个答案:

答案 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

除了缩短时,我还能感受到以下额外的好处:

  1. 避免Pascal I / O支持现代流。
  2. 异常处理错误,由流类处理。
  3. 字符串变量的单个分配,而不是重复的低效重新分配。
  4. 如果必须使用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;