C# WPF应用中CSV文件写入功能的实现问题
C# WPF应用中CSV文件写入功能的实现问题
嗨,看起来你已经把基础框架搭得七七八八了,就差核心的LogIntoFile方法实现对吧?别着急,我来一步步帮你搞定这个问题!
首先,咱们得先在MainWindow类里加一个计数器变量,用来记录每次触发日志时的计数:
private int counter = 0; // 新增计数器变量,记录日志次数
接下来就是关键的LogIntoFile方法了,这个方法要处理表头写入、数据拼接和文件写入三个核心逻辑,代码如下:
private void LogIntoFile(object sender, EventArgs e) { // 先获取文件路径,避免空路径报错 string logFilePath = txtLogPath.Text; if (string.IsNullOrEmpty(logFilePath)) { MessageBox.Show("日志文件路径不能为空!"); autoLogTimer.Stop(); // 路径不对就停止定时器 return; } // 递增计数器 counter++; // 获取当前格式化的时间 string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 精确到毫秒,可按需调整 try { // 使用using语句确保StreamWriter自动释放资源,避免文件被占用 using (StreamWriter writer = new StreamWriter(logFilePath, true, Encoding.UTF8)) { // 第一次写入时先写表头 if (!headersWritten) { writer.WriteLine("时间,计数器值"); headersWritten = true; } // 写入当前日志行,注意CSV用逗号分隔(如果内容含逗号要加引号,这里咱们先简化处理) writer.WriteLine($"{currentTime},{counter}"); } } catch (Exception ex) { MessageBox.Show($"写入日志失败:{ex.Message}"); autoLogTimer.Stop(); // 出错就停止定时器,避免反复报错 } }
另外,你之前的停止按钮代码没写完,补全一下:
private void btnStopLog_Click(object sender, RoutedEventArgs e) { autoLogTimer.Stop(); counter = 0; // 可选:停止后重置计数器,下次启动从1开始 }
几个需要注意的点:
- 文件写入模式:
StreamWriter的第二个参数传true表示追加写入,这样每次日志都会加到文件末尾,不会覆盖之前的内容。 - 资源释放:用
using包裹StreamWriter,不管有没有异常都会自动关闭文件,避免出现文件被占用的问题。 - 异常处理:加上try-catch块能防止写入失败导致程序崩溃,还能及时给用户提示。
- 时间格式:我用了
yyyy-MM-dd HH:mm:ss.fff的格式,你可以根据需求调整,比如去掉毫秒或者改成其他格式。
这样一来,当你点击启动按钮后,定时器每3秒就会把当前时间和计数器值写入指定的CSV文件,表头只会在第一次启动时写一次,停止后计数器还能重置(可选),完美解决你的需求!
备注:内容来源于stack exchange,提问作者Uuno Purhaturo
相关产品推荐
相关产品推荐

