如何让StreamReader读取Read.Line()流时仅显示最后匹配内容?
解决StreamReader读取文件只显示最后一个匹配项的问题
我懂你现在的烦恼——每次搜匹配内容弹出一堆MessageBox,15次弹窗确实够闹心的!你现在的问题根源是每找到一行匹配就立刻弹窗,而不是等读完整个文件后再展示最后那个匹配结果。咱们只需要调整一下逻辑,用一个变量存住最后匹配到的内容就行,具体改法如下:
修改后的代码示例
string tmpFile = "你的临时文件路径"; // 确保这里路径正确 string SteamLogFilePath = "你的Steam日志路径"; string lastMatch = null; // 用来存储最后一个匹配的行 try { File.Copy(SteamLogFilePath, tmpFile, true); } catch (Exception ex) { // 可选:添加异常提示,比如 MessageBox.Show("复制文件失败:" + ex.Message); } // 使用using包裹StreamReader,自动处理资源释放,避免泄漏 using (TextReader tr = new StreamReader(tmpFile)) { string line; // 优化循环条件,读取到文件末尾自动终止 while ((line = tr.ReadLine()) != null) { // 找到匹配行时,只更新lastMatch变量,不立刻弹窗 if (line.Contains("RecvMsgClientLogOnResponse")) { lastMatch = line; } } } // 遍历完所有行后,再弹出最后一个匹配的内容 if (lastMatch != null) { MessageBox.Show(lastMatch); }
关键修改点说明
- 新增
lastMatch变量:专门记录每次匹配到的最新行,后面的匹配会覆盖前面的,最终只会保留最后一个匹配项 - 移走循环内的弹窗操作:把原来在循环里的
MessageBox.Show放到循环结束后,确保只弹一次,展示最后找到的结果 - 改用
using管理资源:自动释放StreamReader占用的文件资源,比手动try/finally写法更安全简洁 - 优化循环逻辑:把
while(true)改成while ((line = tr.ReadLine()) != null),读取到文件末尾时自动终止循环,避免无限循环的风险
这样修改后,你就只会看到一次弹窗,显示的就是文件中最后一个包含指定字符串的行啦!
内容的提问来源于stack exchange,提问作者Xhonor
相关产品推荐
相关产品推荐

