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
        {
            // 清理失败不影响主流程
        }
    }
}
相关推荐
一心赚狗粮的宇叔9 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
cplmlm10 小时前
EF Core使用CodeFirst生成postgresql数据库表名以及字段名用蛇形命名法,而类名仍使用驼峰命名
c#
lingxiao1688811 小时前
WebApi详解+Unity注入--下篇:Unity注入
unity·c#·wpf
lingxiao1688814 小时前
WebApi详解+Unity注入--中篇:.net core的WebAPI
unity·c#·.netcore
ServBay14 小时前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net
故事不长丨18 小时前
C#进制转换:从基础原理到实战应用
开发语言·c#·进制转换·16进制·2进制·10进制
liulilittle18 小时前
VEthernet 框架实现 tun2socks 的技术原理
网络·windows·c#·信息与通信·通信
云草桑19 小时前
.net AI API应用 客户发的信息提取对接上下游系统报价
ai·c#·.net·semantickernel·sk
故事不长丨20 小时前
C#File文件操作全解析:从基础用法到异常处理
服务器·开发语言·visualstudio·c#·文件操作·io流·file
工程师00721 小时前
C# 动态编程(基于 dynamic 类型)
开发语言·c#·dynamic·动态编程