当前,我有一个.txt
文件,该文件具有执行数据库中的“选择”所花费的时间,执行时间以及检索的行数。我想做的是删除早于x日期生成的日志。
附加到.txt的代码:
public void LogSQL(string rowsSQL, float timeSQL, string stringSQL)
{
System.IO.StreamWriter sw = System.IO.File.AppendText(pathTxt() + "LogsSQL.txt");
try
{
string x = System.String.Format("{0} - SQL STATEMENT: {1}{2} Number of Rows: {3}{4} Process Time: {5} seconds {6}--------------------------------------------------------------------------------------", System.DateTime.Now, stringSQL, Environment.NewLine, rowsSQL, Environment.NewLine, timeSQL, Environment.NewLine);
sw.WriteLine(x);
}
finally
{
sw.Close();
}
}
答案 0 :(得分:0)
没有简单的出路。唯一可能的解决方案是使用临时名称复制日志文件,将其打开并解析每一行以查找日期戳。如果日期较早,则某个截止日期将丢弃该行,否则将其写入另一个临时文件中。完成后,复制新文件以覆盖当前文件(当然,如果有多个线程写入同一个文件,则场景会复杂得多)
但是,我建议您对实际代码进行简单的更改,使您可以将日志写入名称基于当前日期的不同文件中。
public void LogSQL(string rowsSQL, float timeSQL, string stringSQL)
{
string logFile = Path.Combine(pathTxt(), $"LogsSQL-{DateTime.Today.ToString("yyyyMMdd"}).txt")
using(System.IO.StreamWriter sw = System.IO.File.AppendText(logFile))
{
string x = System.String.Format(.......);
sw.WriteLine(x);
}
}
通过这种方式,您将当天的所有日志写入同一文件,并将第二天的日志写入另一个文件。此时,在特定日期之前删除日志只是删除匹配文件的问题
public void RemoveLogs(DateTime cutOff)
{
foreach (string s in Directory.EnumerateFiles(@"e:\temp"))
{
int pos = s.LastIndexOf("-");
if (pos != -1)
{
if (pos + 9 < s.Length)
{
string date = s.Substring(pos + 1, 8);
if (DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateFile))
{
if(dateFile < cutOff)
File.Delete(s);
}
}
}
}
}