0

我需要从文件中读取一个时间戳,然后回顾过去 30 分钟,看看是否显示了关键字“CM failed”。这是一个日志文件,即使在应用程序运行时也会不断更新。有任何想法吗?下面提供的代码确实回顾了过去 30 年,但我不确定它到底在看什么时间。

TimeSpan ts = TimeSpan.FromMinutes(30);
//fake file which is opened using Notepad++
string temp = @"C:\Temp\efilelog.txt"; 

private void Form1_Load(object sender, EventArgs e)
{
     string str = File.ReadAllText(temp);

     Regex reg = new Regex("CM failed" + DateTime.Now.Subtract(ts));

     Match mat = reg.Match(str);

     // Get the creation time of a well-known directory.
     //DateTime dt = File.GetLastWriteTime(file);
     //Console.WriteLine("The last write time for this file was {0}.", dt, ts);

     if (mat.Success)
     {
         //send email which I already have functional
     }

     this.Close();
    }
}
4

2 回答 2

0

您需要从文件中解析上次失败的时间,并检查该日期是否在最近 30 分钟内。假设您正在编写这样的失败时间:

using (var writer = File.AppendText("efilelog.txt"))            
    writer.WriteLine("CM failed {0}", DateTime.Now.ToString());

然后您将需要以下查询和正则表达式来获取上次失败时间:

Regex regex = new Regex("CM failed(?<time>.+)");
var lastFailTime = File.ReadLines("efilelog.txt")
                       .Select(line => regex.Match(line))
                       .Where(m => m.Success) // take only matched lines
                       .Select(m => DateTime.Parse(m.Groups["time"].Value))
                       .DefaultIfEmpty() // DateTime.Min if no failures
                       .Max();

然后检查失败是否在 30 分钟内:

TimeSpan span = TimeSpan.FromMinutes(30);
if (span > DateTime.Now - lastFailTime)
    // alert 

根据您的新要求,您应该使用以下正则表达式:

Regex regex = new Regex("(?<time>.+(AM|PM)).*CM failed");
于 2013-06-24T13:37:56.253 回答
0

如果你问你的代码是做什么的。它正在检查 CM FAILED + 您的 datetime 对象的 ToString() 默认字符串转换,CM FAILED 和它之间没有空格。

这是你的意图吗?

于 2013-06-24T13:19:14.660 回答