c# 简单实现将Message的内容保存到txt中,超过100个则清理旧文件

csharp 复制代码
using System;
using System.IO;
using System.Threading;

public static class LogManager
{
    private static readonly object _fileLock = new object(); // 线程安全锁
    private const int MaxFiles = 100;                        // 最大文件数限制
    private const string LogDirectory = "Logs";              // 日志目录
    private const string FilePrefix = "log_";                // 文件名前缀
    private const string FileExtension = ".txt";             // 文件扩展名

    /// <summary>
    /// 安全写入日志(自动处理文件滚动和清理)
    /// </summary>
    public static void SaveMessageWithRotation(string message)
    {
        try
        {
            // 确保日志目录存在
            Directory.CreateDirectory(LogDirectory);

            // 线程安全操作
            lock (_fileLock)
            {
                // 生成带时间戳的新文件名
                string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmssfff");
                string newFilePath = Path.Combine(LogDirectory, $"{FilePrefix}{timestamp}{FileExtension}");

                // 写入新文件
                File.WriteAllText(newFilePath, message);

                // 执行文件清理(异步不阻塞当前操作)
                ThreadPool.QueueUserWorkItem(_ => CleanOldLogs());
            }
        }
        catch (Exception ex)
        {
            // 这里应该用真正的日志系统记录错误(如NLog)
            Console.WriteLine($"日志写入失败: {ex.Message}");
        }
    }

    /// <summary>
    /// 清理旧日志文件(保留最新100个)
    /// </summary>
    private static void CleanOldLogs()
    {
        try
        {
            var directory = new DirectoryInfo(LogDirectory);
            if (!directory.Exists) return;

            // 获取所有日志文件并按创建时间排序
            var files = directory.GetFiles($"{FilePrefix}*{FileExtension}")
                               .OrderBy(f => f.CreationTime)
                               .ToArray();

            // 删除超出数量的旧文件
            if (files.Length > MaxFiles)
            {
                foreach (var file in files.Take(files.Length - MaxFiles))
                {
                    try { file.Delete(); }
                    catch { /* 忽略删除失败 */ }
                }
            }
        }
        catch
        {
            // 清理失败不影响主流程
        }
    }
}
相关推荐
MyBFuture5 分钟前
编程实战:相机连接与参数设置指南
windows·c#·visual studio·vision pro·联合编程
kylezhao20198 分钟前
深入浅出理解 C# WPF 的事件
开发语言·c#·wpf
我要打打代码17 分钟前
C# 各种类库
开发语言·c#
一刻钟.13 小时前
C#高级语法之线程与任务
开发语言·c#
weixin_3077791314 小时前
C#实现两个DocumentDB实例之间同步数据
开发语言·数据库·c#·云计算
foundbug99914 小时前
基于C#的OPC DA客户端实现源码解析
开发语言·c#
Crazy Struggle16 小时前
.NET 中如何快速实现 List 集合去重?
c#·.net
xb113216 小时前
C#生产者-消费者模式
开发语言·c#
今晚打老虎z17 小时前
解决SQL Server 安装运行时针对宿主机内存不足2GB的场景
sqlserver·c#
Traced back18 小时前
# C# WinForms 数据库清理系统基础知识与避坑指南
开发语言·数据库·c#