Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取最后一次打印C中带有“关键字”的行之后的所有行_C#_Stringbuilder_Streamreader_Streamwriter - Fatal编程技术网

C# 获取最后一次打印C中带有“关键字”的行之后的所有行

C# 获取最后一次打印C中带有“关键字”的行之后的所有行,c#,stringbuilder,streamreader,streamwriter,C#,Stringbuilder,Streamreader,Streamwriter,我正在做一个c项目。 每当应用程序崩溃时,我都试图通过电子邮件发送日志文件。 不过,日志文件的大小稍微大一点 所以我认为我应该只包括日志文件的一个特定部分 为此,我正在尝试读取具有指定关键字的line的最后一个实例之后的所有行。在我的示例中,应用程序已启动 由于应用程序因崩溃而多次重新启动,“应用程序已启动”会在文件中多次打印。所以我只希望最后一次打印包含“applicationstarted”的行&这之后的行直到文件结束 我需要帮助来弄清楚我该怎么做 到目前为止,我刚刚开始使用基本代码 Sys

我正在做一个c项目。 每当应用程序崩溃时,我都试图通过电子邮件发送日志文件。 不过,日志文件的大小稍微大一点

所以我认为我应该只包括日志文件的一个特定部分

为此,我正在尝试读取具有指定关键字的line的最后一个实例之后的所有行。在我的示例中,应用程序已启动

由于应用程序因崩溃而多次重新启动,“应用程序已启动”会在文件中多次打印。所以我只希望最后一次打印包含“applicationstarted”的行&这之后的行直到文件结束

我需要帮助来弄清楚我该怎么做

到目前为止,我刚刚开始使用基本代码

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标志以确定是否已找到关键字-如果未找到,则不要写入任何行。