delphi 如何防止TStrings.SaveToFile创建最后一个空行?

ctehm74n  于 2023-05-28  发布在  其他
关注(0)|答案(3)|浏览(318)

我有一个.\input.txt文件,如下所示:

aaa
bbb
ccc

如果我使用TStrings.LoadFromFile读取它并使用TStrings.SaveToFile写回(即使没有应用任何更改),它会在输出文件的末尾创建一个空行。

var
  Lines : TStrings;
begin
  Lines := TStringList.Create;
  try
    Lines.LoadFromFile('.\input.txt');

    //...

    Lines.SaveToFile('.\output.txt');
  finally
    Lines.Free;
  end;
end;

使用TStrings.Text属性可以观察到相同的行为,该属性将返回一个末尾包含空行的字符串。

w8f9ii69

w8f9ii691#

对于 Delphi 10.1和更新版本,有一个属性TrailingLineBreak控制此行为。
当TrailingLineBreak属性为True(默认值)时,Text属性将在最后一行后包含换行符。如果为False,则Text值在最后一行后不包含换行符。这也可以由soTrailingLineBreak选项控制。

ee7vknir

ee7vknir2#

对于 Delphi 10.1(柏林)或更新版本,最佳解决方案在Uwe的回答中描述。
对于较旧的 Delphi 版本,我通过创建TStringList的子类并重写TStrings.GetTextStr虚函数找到了解决方案,但我很高兴知道是否有更好的解决方案,或者其他人是否在我的解决方案中发现了错误

接口:

uses
    Classes;

  type
    TMyStringList = class(TStringList)
    private
      FIncludeLastLineBreakInText : Boolean;
    protected
      function GetTextStr: string; override;
    public
      constructor Create(AIncludeLastLineBreakInText : Boolean = False); overload;
      property IncludeLastLineBreakInText : Boolean read FIncludeLastLineBreakInText write FIncludeLastLineBreakInText;
    end;

实现方式:

uses
  StrUtils;      

constructor TMyStringList.Create(AIncludeLastLineBreakInText : Boolean = False);
begin
  inherited Create;

  FIncludeLastLineBreakInText := AIncludeLastLineBreakInText;
end;

function TMyStringList.GetTextStr: string;
begin
  Result := inherited;

  if(not IncludeLastLineBreakInText) and EndsStr(LineBreak, Result)
  then SetLength(Result, Length(Result) - Length(LineBreak));
end;

示例:

procedure TForm1.Button1Click(Sender: TObject);
var
  Lines : TStrings;
begin
  Lines := TMyStringList.Create();
  try
    Lines.LoadFromFile('.\input.txt');
    Lines.SaveToFile('.\output.txt');
  finally
    Lines.Free;
  end;
end;
nxowjjhe

nxowjjhe3#

怎么样:

Lines.Text:=Trim(Lines.Text);

相关问题