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

本文关键字:CreationTime 新文件 创建 文件 fileinfo | 更新日期: 2023-09-27 18:18:08

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

这工作得很好,除了当我看FileInfo。无论我做什么,我的log.txt文件的创建时间总是一样的——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);
    }
}

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

可能会发生这种情况,所以它写在FileSystemInfo中。CreationTime

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

我认为问题是你正在使用FileInfo。创建时间,而不首先检查文件是否还存在。运行这个POC -它将总是生成"删除后创建时间:1/1/1601 12:00:00 AM"-因为文件不存在了,你没有触摸FileInfo。删除前的创建时间。但是,如果取消注释行:

//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);

            }
        }
    }
}