0

私はロギングクラスを持っています。log.txt ファイルが存在しない場合は新しいファイルを作成し、そのファイルにメッセージを書き込みます。また、ファイル サイズと、ファイルがローカル設定に対して作成された時期を確認するために実行するメソッドもあります。log.txt の作成時刻と現在時刻の差がローカル設定の MaxLogHours 値を超える場合、log.txt はローカル アーカイブ フォルダーにアーカイブされ、削除されます。新しい log.txt ファイルは、次にログ メッセージがクラスに送信されたときに、上記のプロセスによって作成されます。

これはうまく機能しますが、log.txt ファイルの FileInfo.CreationTime を見ると、常に同じ - 2012 年 7 月 17 日 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

これが起こった可能性があるため、FileSystemInfo.CreationTimeに書き込まれます。

このメソッドは、値がオペレーティング システムによって継続的に更新されない可能性があるネイティブ関数を使用するため、不正確な値を返す可能性があります。

于 2013-06-13T13:46:16.357 に答える
0

問題は、ファイルがまだ存在するかどうかを最初に確認せずに FileInfo.CreationTime を使用していることだと思います。この POC を実行すると、常に「After delete 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 に答える