创建新文件后,fileinfo.CreationTime保持不变

时间:2013-06-13 13:39:23

标签: c# .net

我有一个日志记录类。它创建了一个新的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);
    }
}

2 个答案:

答案 0 :(得分:1)

这可能发生了,所以它写在FileSystemInfo.CreationTime

  

此方法可能返回不准确的值,因为它使用native   其值可能不会被连续更新的函数   操作系统。

答案 1 :(得分:0)

我认为问题是你在使用FileInfo.CreationTime而没有先检查文件是否仍然存在。运行此POC - 它将始终生成“After Creation 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);


            }

        }
    }
}