减少函数中的代码行以读取 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
。
除了变短之外,我还发现了以下额外好处:
- 避免使用 Pascal I/O 以支持现代流。
- 异常错误处理,由流处理class。
- 字符串变量的单次分配与重复低效的重新分配相反。
如果您必须使用 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;
我正在尝试削减这段代码的行数,但我看不出我显示的代码是如何实现的最少行数:
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
。
除了变短之外,我还发现了以下额外好处:
- 避免使用 Pascal I/O 以支持现代流。
- 异常错误处理,由流处理class。
- 字符串变量的单次分配与重复低效的重新分配相反。
如果您必须使用 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;