You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi实现按条目数拆分日志文件的问题求助

解决方案:Delphi实现按条目数拆分日志文件

原代码的核心问题在于:仅硬编码检查了带1后缀的文件,且每次创建该文件时直接用rewrite覆盖原有内容,同时没有循环检查后续编号的文件是否存在、是否还能写入。以下是修复后的完整实现:

关键改进点

  • 用常量定义单文件最大日志条目数,便于后续维护
  • 循环遍历日志文件编号,自动找到第一个可写入的文件(要么行数未满,要么是待创建的新文件)
  • 严格区分append(续写)和rewrite(新建)的使用场景,避免覆盖已有内容
  • 统一日期格式处理逻辑,减少冗余代码

修复后的代码

procedure TForm1.Button3Click(Sender: TObject);
const
  MAX_LOG_ROWS = 50; // 单文件最大日志条目数,可按需修改
  LOG_DIR = 'D:\LogLprf\'; // 日志存储目录
  LOG_BASE_NAME = 'LogLpFr '; // 日志基础文件名

  function CountRows(const AFilename: string): Integer;
  var
    f: TextFile;
  begin
    Result := 0;
    if not FileExists(AFilename) then Exit;

    AssignFile(f, AFilename);
    try
      Reset(f);
      while not Eof(f) do
      begin
        ReadLn(f);
        Inc(Result);
      end;
    finally
      CloseFile(f);
    end;
  end;

var
  f: TextFile;
  FileName: string;
  FileIndex: Integer;
  fs: TFormatSettings;
  BaseDateStr: string;
begin
  // 初始化日期格式设置
  fs := TFormatSettings.Create;
  fs.ShortDateFormat := 'DD.MM.YYYY';
  fs.TimeSeparator := ':';
  BaseDateStr := DateToStr(Now, fs);

  FileIndex := 0;
  while True do
  begin
    // 生成对应编号的日志文件名:编号0时无后缀,其余带数字后缀
    if FileIndex = 0 then
      FileName := LOG_DIR + LOG_BASE_NAME + BaseDateStr + '.txt'
    else
      FileName := LOG_DIR + LOG_BASE_NAME + BaseDateStr + IntToStr(FileIndex) + '.txt';

    // 判断当前文件是否可写入
    if FileExists(FileName) then
    begin
      if CountRows(FileName) < MAX_LOG_ROWS then
        Break; // 当前文件未满,确定为写入目标
    end
    else
      Break; // 文件不存在,将创建新文件

    Inc(FileIndex); // 当前文件已满,检查下一个编号的文件
  end;

  // 打开目标文件:存在则续写,不存在则新建
  AssignFile(f, FileName);
  try
    if FileExists(FileName) then
      Append(f)
    else
      Rewrite(f);

    // 写入格式化后的日志内容
    fs.ShortDateFormat := 'DD.MM.YYYY HH:mm:ss';
    Writeln(f, DateTimeToStr(Now, fs) + '- ' + 'Some error...');
  finally
    CloseFile(f);
  end;
end;

代码说明

  1. 常量定义:把易变的配置项(最大行数、目录、文件名)抽成常量,后续调整无需改动核心逻辑
  2. CountRows函数优化:增加文件存在判断,避免空文件异常;用try-finally确保文件一定会关闭
  3. 文件遍历逻辑:从编号0开始依次检查,自动定位到第一个可写入的文件,支持无限多文件拆分
  4. 文件打开逻辑:严格根据文件状态选择续写或新建,彻底解决覆盖旧文件的问题
  5. 格式处理:统一创建TFormatSettings实例,避免全局系统格式影响日志输出

内容的提问来源于stack exchange,提问作者Petar Sindjic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:21:11