C# 获取最后一次打印C中带有“关键字”的行之后的所有行
我正在做一个c项目。 每当应用程序崩溃时,我都试图通过电子邮件发送日志文件。 不过,日志文件的大小稍微大一点 所以我认为我应该只包括日志文件的一个特定部分 为此,我正在尝试读取具有指定关键字的line的最后一个实例之后的所有行。在我的示例中,应用程序已启动 由于应用程序因崩溃而多次重新启动,“应用程序已启动”会在文件中多次打印。所以我只希望最后一次打印包含“applicationstarted”的行&这之后的行直到文件结束 我需要帮助来弄清楚我该怎么做 到目前为止,我刚刚开始使用基本代码C# 获取最后一次打印C中带有“关键字”的行之后的所有行,c#,stringbuilder,streamreader,streamwriter,C#,Stringbuilder,Streamreader,Streamwriter,我正在做一个c项目。 每当应用程序崩溃时,我都试图通过电子邮件发送日志文件。 不过,日志文件的大小稍微大一点 所以我认为我应该只包括日志文件的一个特定部分 为此,我正在尝试读取具有指定关键字的line的最后一个实例之后的所有行。在我的示例中,应用程序已启动 由于应用程序因崩溃而多次重新启动,“应用程序已启动”会在文件中多次打印。所以我只希望最后一次打印包含“applicationstarted”的行&这之后的行直到文件结束 我需要帮助来弄清楚我该怎么做 到目前为止,我刚刚开始使用基本代码 Sys
System.IO.StreamReader file = new System.IO.StreamReader("c:\\mylogfile.txt");
while((line = file.ReadLine()) != null)
{
if ( line.Contains("keyword") )
{
}
}
逐行阅读文件,直到找到关键字。找到关键词后,开始将其后的每一行都放入列表中。如果你发现另一行有你的关键字,只需清除你的列表并从那一点开始重新填充它 比如:
List<string> buffer = new List<string>();
using (var sin = new StreamReader("pathtomylogfile"))
{
string line;
bool read;
while ((line = sin.ReadLine())!=null)
{
if (line.Contains("keyword"))
{
buffer.Clear();
read = true;
}
if (read)
{
buffer.Add(line);
}
}
// now buffer has the last entry
// you could use string.Join to put it back together in a single string
var lastEntry = string.Join("\n",buffer);
}
如果每个条目中的行数非常大,那么首先扫描文件以找到最后一个条目,然后再次循环以提取它可能会更有效。如果整个日志文件没有那么大,只需ReadToEnd,然后使用LastIndexOf查找最后一个条目的开头可能会更有效。读取文件中的所有内容,然后选择所需的部分
string lines = System.IO.File.ReadAllText("c:\\mylogfile.txt");
int start_index = lines.LastIndexOf("Application Started");
string needed_portion = lines.Substring(start_index);
SendEmail(needed_portion);
我建议您使用合适的记录器,如log4net或NLogger。 您可以将其配置为保存到多个文件中—一个包含完整日志,另一个仅包含错误/异常。此外,您还可以设置日志文件的最大大小等,或者配置它们,以便在发生异常时向您发送邮件 当然,这并不能解决您当前的问题,因为上面有一些解决方案
但我会尝试更简单的方法,比如试用Notepad++——它可以处理更大的文件上次我用它格式化了一个30MB的XML文档,花了大约20分钟,但他做到了!对于简单的文本文件,应该有更好的性能。。或者,如果您仅为阅读而不是编辑而打开文件,则在Windows中可能会获得更好的性能。请发布您的内容tried@SuncoastOwner:这将需要首先加载整个日志文件,这可能是问题,也可能不是问题。添加bool标志以确定是否已找到关键字-如果未找到,则不要写入任何行。