StreamWriter不写数据

本文关键字:数据 StreamWriter | 更新日期: 2023-09-27 18:13:54

我使用StraemWriter将文本消息记录到日志文件中。如果日志文件不存在,则应该创建日志文件;如果文件创建日期小于给定时间,则应该追加日志文件;如果在给定时间之前创建日志文件,则应该重新创建日志文件。我正在使用

下面的类/代码
public static class LogIt
{
    private const string LOG_FNAME = @"Logfile.log";
    public static void WriteMsg(string msg)
    {
        bool append = true;
        if (File.Exists(LOG_FNAME))
        {
            //DateTime delDate = DateTime.Now.AddDays(-1);
            DateTime delDate = DateTime.Now.AddMinutes(-30);
            DateTime fileCreatedDate = File.GetCreationTime(LOG_FNAME);
            if (DateTime.Compare(fileCreatedDate, delDate) < 0)
            {
                Console.WriteLine("DELETE FILE");
                File.Delete(LOG_FNAME);
            }
        }
        using (StreamWriter sw = new StreamWriter(LOG_FNAME, append))
        {
            sw.WriteLine(msg);
        }
        Console.WriteLine(msg);
    }
}

这个类被任务调度程序运行的一个简单的控制台应用程序使用,它每隔x分钟运行一次。

消息如下:

LogIt.WriteMsg("Log this message");

当文件最初创建时,消息被记录在文件中,但是当文件创建日期超过删除日期时,文件被重新创建,但没有后续消息被写入文件。

知道为什么吗?

StreamWriter不写数据

由于某些原因,该文件具有初始创建日期(具有该路径的文件第一次被创建)作为创建日期,即使它在删除后被重新创建。您可以检查文件属性,看到日志文件的创建日期总是相同的。一种解决方法是,每当重新创建文件时,在代码中更新文件创建日期。你可以使用FileInfo类。

@MPD没问题。以下是我建议的解决方案的实现。试一试,让我知道是否有效。

private const string LOG_FNAME = @"Logfile.log";
        public static void WriteMsg(string msg)
        {
            bool deleted = false;
            bool append = true;
            if (File.Exists(LOG_FNAME))
            {
                //DateTime delDate = DateTime.Now.AddDays(-1);
                DateTime delDate = DateTime.Now.AddMinutes(-30);
                DateTime fileCreatedDate = File.GetCreationTime(LOG_FNAME);
                if (DateTime.Compare(fileCreatedDate, delDate) < 0)
                {
                    Console.WriteLine("DELETE FILE");
                    File.Delete(LOG_FNAME);
                    //record that file was deleted and a new one will be created
                    deleted = true;
                }
            }
            using (StreamWriter sw = new StreamWriter(LOG_FNAME, append))
            {
                sw.WriteLine(msg);
            }
            if (deleted)
            {
                //a new file is created. Make sure the creation time is set
                FileInfo fi = new FileInfo(LOG_FNAME);
                fi.CreationTime = DateTime.Now;
            }
            Console.WriteLine(msg);
        }

我猜你是在Windows 2003(或XP)上运行这段代码。如果是这样:当你在T1时刻在某个目录创建了一个文件,然后删除它,然后重新创建它;惊喜,惊喜,它的创建日期是T1 !

我知道这只是因为我在Windows 2003上有同样的问题!

顺便说一句,我现在使用NLog, (IMHO)它是完美的,有我需要的一切。