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
        {
            // 清理失败不影响主流程
        }
    }
}
相关推荐
ghost1434 小时前
C#学习第17天:序列化和反序列化
开发语言·学习·c#
爱编程的鱼8 小时前
C# 变量||C# 常量
java·开发语言·c#
DanmF--9 小时前
详解与HTTP服务器相关操作
服务器·网络·网络协议·http·unity·c#
江沉晚呤时11 小时前
从零开始学习 Lucene.Net:.NET Core 中的全文搜索与索引管理
开发语言·c#·.net·mybatis·.netcore·lucene
界面开发小八哥12 小时前
界面控件DevExpress WPF v25.1新功能预览 - 文档处理类功能升级
c#·wpf·界面控件·devexpress·ui开发
He BianGu12 小时前
【WPF-VisionMaster源代码】应用OpenCVSharp仿Vision Master页面开发的软件源代码
图像处理·opencv·c#·wpf·机器视觉·visionmaster·视频处理
Eiceblue13 小时前
通过C# 将Excel表格转换为图片(JPG/ PNG)
visualstudio·c#·.net·excel
FAREWELL0007513 小时前
C#进阶学习(七)常见的泛型数据结构类(2)HashSet和SortedSet
数据结构·学习·c#·hashset·sortedset
年少无知且疯狂2 天前
C# 对列表中的元素的多个属性进行排序
unity·c#·游戏引擎