0

我有一个日志类。如果不存在,它会创建一个新的 log.txt 文件并将消息写入该文件。我还有一种方法可以运行以检查文件大小以及根据本地设置创建文件的时间。如果 log.txt 的创建时间与当前时间的差值超过本地设置的 MaxLogHours 值,则将其存档到本地存档文件夹并删除。新的 log.txt 文件由上述过程在下次向类发送日志消息时创建。

这很好用,除了当我查看我的 log.txt 文件的 FileInfo.CreationTime 时,它​​总是相同的 - 7/17/2012 12:05/18 PM - 无论我做什么。我已经手动删除了文件,程序删除了它,总是一样的。这里发生了什么?我也给旧的加了时间戳,但仍然没有任何效果。Windows 是否认为该文件是同一个文件,因为它具有相同的文件名?我会很感激任何帮助,谢谢!

归档方法

    public static void ArchiveLog(Settings s)
    {
        FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt");
        string archiveDir = AppDomain.CurrentDomain.BaseDirectory + "\\archive";
        TimeSpan ts = DateTime.Now - fi.CreationTime;

        if ((s.MaxLogKB != 0 && fi.Length >= s.MaxLogKB * 1000) || 
            (s.MaxLogHours != 0 && ts.TotalHours >= s.MaxLogHours))
        {
            if (!Directory.Exists(archiveDir))
            {
                Directory.CreateDirectory(archiveDir);
            }
            string archiveFile = archiveDir + "\\log" + string.Format("{0:MMddyyhhmmss}", DateTime.Now) + ".txt";

            File.Copy(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt", archiveFile);
            File.Delete(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt");
        }
    }

写入/创建日志:

public static void MsgLog(string Msg, bool IsStandardMsg = true)
{
    try
    {
        using (StreamWriter sw = new StreamWriter(Directory.GetCurrentDirectory() + "\\log.txt", true))
        {
            sw.WriteLine("Msg at " + DateTime.Now + " - " + Msg);
            Console.Out.WriteLine(Msg);
        }
    }

    catch (Exception ex)
    {
        Console.Out.WriteLine(ex.Message);
    }
}
4

2 回答 2

1

This may happened , so it's writen in FileSystemInfo.CreationTime

This method may return an inaccurate value, because it uses native functions whose values may not be continuously updated by the operating system.

于 2013-06-13T13:46:16.357 回答
0

我认为问题在于您使用 FileInfo.CreationTime 而没有首先检查文件是否仍然存在。运行此 POC - 它总是会生成“删除后 CreationTime: 1/1/1601 12:00:00 AM” - 因为文件不再存在并且您在删除之前没有触摸 FileInfo.CreationTime。但是,如果您取消注释该行:

//Console.WriteLine("Before delete CreationTime: {0}", fi.CreationTime);

在下面的代码中,奇怪的是两个调用都将返回正确和更新的值。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication17088573
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {


                string fname = "testlog.txt";

                using (var fl = File.Create(fname))
                {
                    using (var sw = new StreamWriter(fl))
                    {
                        sw.WriteLine("Current datetime is {0}", DateTime.Now);
                    }
                }
                var fi = new FileInfo(fname);
                //Console.WriteLine("Before delete CreationTime: {0}", fi.CreationTime);
                File.Delete(fname);
                Console.WriteLine("After delete CreationTime: {0}", fi.CreationTime);
                Thread.Sleep(1000);


            }

        }
    }
}
于 2013-06-13T14:00:16.797 回答