我需要将当前日期和时间以及程序的当前计数器值记录到 csv 文件中。它从一个启动计数器的按钮开始,计数器运行一个执行日志记录的方法。我的问题只是构建方法的正确方法,我无法弄清楚。
计时器和 header bool 在 Mainwindow : Window 下确定
private DispatcherTimer autoLogTimer = new DispatcherTimer();
private bool headersWritten = false;
定时器和文件路径在InitializeComponent()下确定;
autoLogTimer.Tick += LogIntoFile;
autoLogTimer.Interval = new TimeSpan(0, 0, 0, 3);
txtLogPath.Text = "D:\\Programming\\Robot\\log file.csv";
按下按钮时开始记录,按下另一个按钮时停止。
private void btnStartLog_Click(object sender, RoutedEventArgs e)
{
headersWritten = false; // This resets the bool when starting a new log
autoLogTimer.Start();
}
private void btnStopLog_Click(object sender, RoutedEventArgs e)
{
autoLogTimer.Stop();
}
最后,日志记录是通过 LogIntoFile 方法完成的。此方法与 autoLogTimer 一起运行,并且应每 3 秒记录一次所有内容。标题应位于文本上方,文本应每 3 秒记录在标题下方。每次按下按钮时,标题应该只出现一次,并且每次按下按钮时都会出现标题,这样您就可以看到从文件开始记录的次数。
private void LogIntoFile(object sender, EventArgs e)
{
try
{
string logLine = $"{DateTime.Now},{txtCounter.Text}{Environment.NewLine}";
if (!headersWritten)
{
// Write headers if they haven't been written yet
File.WriteAllText(txtLogPath.Text, "Date Quantity" + Environment.NewLine);
headersWritten = true;
}
File.AppendAllText(txtLogPath.Text, logLine);
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}. Check the file path.");
autoLogTimer.Stop();
}
}
当前 File.WriteAllText 显示红色,错误代码为“CS0103”,“名称‘文件’在当前上下文中不存在”。我尝试使用不同的 CsvHelper 函数构建该方法,但无法将其实现按照我想要的方式工作。最终文件应该类似于以下内容:
Date: Quantity:
1.1.2024 31
1.1.2024 32
我在这个网站上找到的方法对我来说不起作用,ChatGPT 提出的任何建议也不起作用。当前版本是我自己制作的,不是 ChatGPT 制作的或在本网站上找到的。
我强烈建议用 StreamWriter 替换 File IO。您的代码应该看起来像这样:
public partial class MainWindow : Window
{
private DispatcherTimer autoLogTimer = new DispatcherTimer();
private bool headersWritten = false;
private StreamWriter fileStream;
private int txtCounter = 0;
public MainWindow()
{
autoLogTimer.Tick += LogIntoFile;
autoLogTimer.Interval = new TimeSpan(0, 0, 0, 3);
string file = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
file = Path.Combine(file, "log.csv");
fileStream = new StreamWriter(file,true);
fileStream.AutoFlush = true;
DataContext = this;
InitializeComponent();
autoLogTimer.Start();
}
private void LogIntoFile(object? sender, EventArgs e)
{
try
{
string logLine = $"{DateTime.Now},{++txtCounter}{Environment.NewLine}";
if (!headersWritten)
{
fileStream.WriteLine("Date,Quantity");
headersWritten = true;
}
fileStream.WriteLine(logLine);
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}. Check the file path.");
autoLogTimer.Stop();
}
}
protected override void OnClosed(EventArgs e)
{
fileStream.Close();
fileStream.Dispose();
base.OnClosed(e);
}
}
注意我已经更改了路径,因此您需要根据您的需要进行调整,并确保您有权操作它。