C# 按日期从文本文件中删除多行

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() {

我有一个C#WPF应用程序,我将日志保存为文本文件

日志保存为
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比较结果作为字符串值,以便重写文件。