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
相关产品推荐
相关产品推荐

