You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何实现程序每次运行时交易ID持续递增并写入日志文件

解决方案

实现思路

要实现跨程序运行的持久化递增ID,核心逻辑是把最后一次使用的transaction ID存储到程序外的持久化介质中,每次程序启动先读取上次的终止ID,本次生成从该ID+1开始,生成完成后再把最新的终止ID写回持久化介质即可。以下提供两种常用实现方案:


方案1:独立计数文件方案(推荐,性能更稳定)

使用单独的文本文件存储最后一次的ID值,无需读取完整的CSV文件,适合CSV体积较大的场景:

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // 路径配置
        string csvPath = @"C:\MyFolder\MyFile.csv";
        string countFileDir = Path.GetDirectoryName(csvPath);
        string countFilePath = Path.Combine(countFileDir, "LastTransactionId.txt");
        
        // 读取上次记录的最后ID,不存在则默认从0开始
        int lastId = 0;
        if (File.Exists(countFilePath))
        {
            string idContent = File.ReadAllText(countFilePath).Trim();
            int.TryParse(idContent, out lastId);
        }

        // 每次生成10条记录
        int batchSize = 10;
        for (int i = 1; i <= batchSize; i++)
        {
            int transactionId = lastId + i;
            string transactionIdStr = transactionId.ToString();
            string date = DateTime.Today.ToString("yyyyMMdd");
            string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 固定时间格式避免区域适配问题
            string appendText = $"{transactionIdStr};{date};{time}{Environment.NewLine}";
            File.AppendAllText(csvPath, appendText);
        }

        // 把最新的最后ID写回计数文件持久化
        int newLastId = lastId + batchSize;
        File.WriteAllText(countFilePath, newLastId.ToString());
    }
}

方案2:直接读取CSV最后一行获取ID(无需额外文件)

适合不想新增独立计数文件的场景,缺点是当CSV体积很大时读取最后一行的性能会降低:

using System;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        string csvPath = @"C:\MyFolder\MyFile.csv";
        int lastId = 0;

        // CSV存在且不为空时读取最后一行的ID
        if (File.Exists(csvPath) && new FileInfo(csvPath).Length > 0)
        {
            string lastLine = File.ReadLines(csvPath).Last();
            if (!string.IsNullOrWhiteSpace(lastLine))
            {
                string[] lineParts = lastLine.Split(';');
                if (lineParts.Length >= 1 && int.TryParse(lineParts[0], out int readId))
                {
                    lastId = readId;
                }
            }
        }

        // 记录生成逻辑和方案1一致
        int batchSize = 10;
        for (int i = 1; i <= batchSize; i++)
        {
            int transactionId = lastId + i;
            string transactionIdStr = transactionId.ToString();
            string date = DateTime.Today.ToString("yyyyMMdd");
            string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            string appendText = $"{transactionIdStr};{date};{time}{Environment.NewLine}";
            File.AppendAllText(csvPath, appendText);
        }
    }
}

注意事项

  • 原代码没有将Environment.NewLine拼接到写入内容中,会导致所有记录挤在同一行,上述代码已修正该问题
  • 原循环i < 10只会生成9条记录,已调整为i <= 10实现每次生成10条的需求
  • 如果存在多进程同时写入的场景,需要对计数文件/CSV加文件锁,避免ID重复生成

内容的提问来源于stack exchange,提问作者denial_perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:24:04