如何读取日志文件并保留格式显示在RichTextBox1?解决加载不全问题
问题:RTF日志文件加载仅显示部分内容,需完善Logger类的日志检查与加载功能
需求:给Logger类新增可在Form1调用的方法,实现以下逻辑:
- 检查日志文件是否存在且大小大于0KB
- 满足条件时读取文件内容,并以和RichTextBox1运行时一致的格式(字体、颜色等)显示
现有问题:尝试通过保存RichTextBox1的RTF内容到文件再加载的方式实现,但加载后仅显示文件的第一部分,实际文件内容完整。
相关代码结构
1. Form1中的Logger实例初始化
private Logger logger; public Form1() { InitializeComponent(); logger = new Logger(richTextBox1, checkBoxSaveLogger.Checked); }
2. Log方法调用示例
string endTime = DateTime.Now.ToString("dd/MM/yyyy HH:mm"); logger.Log($"Ended At: {endTime}", Color.White);
3. 存在问题的Logger类Save/Load逻辑
当前Logger类包含基础日志写入逻辑,以及新增的Save RTF到文件、从文件加载RTF的方法,但加载时仅显示部分内容。
解决方案
1. 修复Save RTF的写入逻辑
确保完整写入RichTextBox的RTF内容,避免截断:
public void SaveLogToFile(string filePath) { if (_richTextBox != null && !string.IsNullOrEmpty(filePath)) { // 直接写入完整RTF内容,避免流操作导致的截断 File.WriteAllText(filePath, _richTextBox.Rtf); } }
2. 完善Load RTF的读取与显示逻辑
读取完整文件内容,同时处理UI线程安全问题:
public bool LoadLogFromFile(string filePath) { // 检查文件存在且大小大于0 if (!File.Exists(filePath)) return false; FileInfo fileInfo = new FileInfo(filePath); if (fileInfo.Length <= 0) return false; try { // 读取完整RTF内容 string rtfContent = File.ReadAllText(filePath); if (string.IsNullOrEmpty(rtfContent)) return false; // 切换到UI线程操作RichTextBox,避免跨线程异常 _richTextBox.Invoke((MethodInvoker)delegate { _richTextBox.Clear(); _richTextBox.Rtf = rtfContent; }); return true; } catch (Exception ex) { Log($"加载日志失败: {ex.Message}", Color.Red); return false; } }
3. 完整Logger类示例
public class Logger { private readonly RichTextBox _richTextBox; private readonly bool _enableSave; private readonly string _logFilePath = "app_log.rtf"; public Logger(RichTextBox richTextBox, bool enableSave) { _richTextBox = richTextBox; _enableSave = enableSave; } // 原有日志写入方法 public void Log(string message, Color color) { _richTextBox.Invoke((MethodInvoker)delegate { _richTextBox.SelectionStart = _richTextBox.TextLength; _richTextBox.SelectionColor = color; _richTextBox.AppendText(message + Environment.NewLine); _richTextBox.ScrollToCaret(); }); // 启用自动保存时,每次日志写入后保存 if (_enableSave) { SaveLogToFile(_logFilePath); } } // 新增保存方法 public void SaveLogToFile(string filePath) { if (_richTextBox != null && !string.IsNullOrEmpty(filePath)) { File.WriteAllText(filePath, _richTextBox.Rtf); } } // 新增加载方法(满足需求) public bool LoadLogFromFile(string filePath) { if (!File.Exists(filePath)) return false; FileInfo fileInfo = new FileInfo(filePath); if (fileInfo.Length <= 0) return false; try { string rtfContent = File.ReadAllText(filePath); if (string.IsNullOrEmpty(rtfContent)) return false; _richTextBox.Invoke((MethodInvoker)delegate { _richTextBox.Clear(); _richTextBox.Rtf = rtfContent; }); return true; } catch (Exception ex) { Log($"加载日志失败: {ex.Message}", Color.Red); return false; } } }
4. Form1中调用加载方法
private void Form1_Load(object sender, EventArgs e) { // 加载日志文件 logger.LoadLogFromFile("app_log.rtf"); }
排查要点
- 检查保存的RTF文件:用记事本打开,确认末尾有RTF结束标记(如
\par }),无标记说明保存时内容被截断 - 确保UI线程操作:所有RichTextBox的操作必须在UI线程执行,否则会导致显示异常
- 验证RichTextBox属性:加载前后保持WordWrap、ScrollBars等属性一致,避免格式显示差异
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

