在 C# WPF 应用程序中写入 csv 文件时出现问题

问题描述 投票:0回答:1

我需要将当前日期和时间以及程序的当前计数器值记录到 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 制作的或在本网站上找到的。

c# wpf csv tcp
1个回答
0
投票

我强烈建议用 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);
     }
 }

注意我已经更改了路径,因此您需要根据您的需要进行调整,并确保您有权操作它。

© www.soinside.com 2019 - 2024. All rights reserved.