C# 按日期从文本文件中删除多行
我有一个C#WPF应用程序,我将日志保存为文本文件 日志保存为C# 按日期从文本文件中删除多行,c#,C#,我有一个C#WPF应用程序,我将日志保存为文本文件 日志保存为YYYY-MM-DD HH:MM LogContent格式 我能够读取日志文件的第一行,并使用下面的代码比较日期,看它是否超过2周 string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string logFileName = @"MyLog.log"; public void CleanupTimeLog() {
YYYY-MM-DD HH:MM LogContent
格式
我能够读取日志文件的第一行,并使用下面的代码比较日期,看它是否超过2周
string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string logFileName = @"MyLog.log";
public void CleanupTimeLog()
{
string getDate = File.ReadLines(filePath + logFileName).First();
DateTime loggedTime = DateTime.Parse(getDate.Substring(0, 10));
if (loggedTime.AddDays(13) < DateTime.Now.Date)
{
// delete the line
}
}
string filePath=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
字符串logFileName=@“MyLog.log”;
public void cleanupmelog()
{
字符串getDate=File.ReadLines(filePath+logFileName).First();
DateTime loggedTime=DateTime.Parse(getDate.Substring(0,10));
if(loggedTime.AddDays(13)
使用foreach
删除多行似乎效率很低。我如何以最简单的方式实现我的目标
我已经检查了一些从文本文件中删除行的示例,但是我仍然不知道如何按日期删除它们
我相信,使用日志文件中日期的格式,可以避免使用
DateTime.Parse
部分,只需使用字符串比较:
public static void DeleteOldLines(string filePath, DateTime minDate)
{
// Convert the specified date to the format used in the log file
var dateStr = minDate.ToString("yyyy-MM-dd");
// Re-write the file with only lines that have the same or more recent date
// Note I added a check for the Length to avoid an exception on Substring
File.WriteAllLines(filePath, File.ReadAllLines(filePath)
.Where(line => line.Length < 10 || line.Substring(0, 10).CompareTo(dateStr) > -1));
}
然后:
DeleteLinesOlderThan(@"f:\public\temp\temp.txt", DateTime.Today);
结果:
2019-11-21今天
2019-11-22这是明天
2019-11-23这是后天
2020-01-01这是明年1月1日
我会阅读所有行,然后创建一个新列表,其中只包含您想要保留的行。然后用新文件覆盖旧文件
public static void CleanupTimeLog(string path)
{
var lines = File.ReadAllLines(path);
var tempFile = Path.GetTempFileName();
File.WriteAllLines(tempFile, lines);
var saveList = new List<string>();
foreach (var line in lines)
{
var date = line.Split(' ')[0];
if (DateTime.TryParse(date, out DateTime result))
{
if (result.AddDays(13) >= DateTime.Now.Date)
{
saveList.Add(line);
}
}
}
File.WriteAllLines(path, saveList);
File.Delete(tempFile);
}
publicstaticvoidcleanupmelog(字符串路径)
{
var lines=File.ReadAllLines(路径);
var tempFile=Path.GetTempFileName();
writeAllines(临时文件,行);
var saveList=新列表();
foreach(行中的var行)
{
var日期=行分割(“”)[0];
if(DateTime.TryParse(date,out DateTime结果))
{
如果(result.AddDays(13)>=DateTime.Now.Date)
{
保存列表。添加(行);
}
}
}
writeAllines(路径,保存列表);
删除(tempFile);
}
使用临时文件是为了安全,以防出现问题。不要删除文件开头的行,请编写一个只包含所需行的新文件。如果你想用新文件替换旧文件,那么。你链接的帖子提供了关于如何删除行的简单而一致的建议(即:只使用你想要的行写入新文件,并在必要时替换原始文件)。具体来说,您正在努力解决这个问题的哪一部分?PS--您是否考虑过更改日志配置,以便不必担心这个问题?大多数日志框架都可以轻松地每天写入新的日志文件,并在一段时间后清理日志文件。我理解了从文本文件中读取所有行的概念,然后只保留我想保留的行,然后替换文件。我链接的帖子中有通过字符串值或行号删除或保留行的示例。我只是不知道如何将我的DateTime比较结果作为字符串值,以便重写文件。