追加时 C# CSV 文件仍然打开

C# CSV file still open when appending

我正在尝试允许用户向我的程序正在构建的 CSV 文件添加另一个条目。它是用这样的数据库构建的:

public void CreateCsvFile()
    {
        var filepath = @"F:\A2 Computing\C# Programming Project\ScheduleFile.csv";
        var ListGather = new PaceCalculator();

        var records =
            from record in ListGather.NameGain()
                .Zip(ListGather.PaceGain(),
                    (a, b) => new { Name = a, Pace = b })
            group record.Pace by record.Name into grs
            select String.Format("{0},{1}", grs.Key, grs.Average()); //reduces the list of integers down to a single double value by computing the average.

        File.WriteAllLines(filepath, records);
    }

然后我像这样将它调用到数据网格视图中:

 private void button2_Click(object sender, EventArgs e)
    {
        CreateExtFile CsvCreate = new CreateExtFile();
        CsvCreate.CreateCsvFile();
        return;
    }

private void LoadAthletes()
    {
        string delimiter = ",";
        string tableName = "Schedule Table";
        string fileName = @"F:\A2 Computing\C# Programming Project\ScheduleFile.csv";

        DataSet dataset = new DataSet();
        StreamReader sr = new StreamReader(fileName);

        dataset.Tables.Add(tableName);
        dataset.Tables[tableName].Columns.Add("Athlete Name");
        dataset.Tables[tableName].Columns.Add("Pace Per Mile");

        string allData = sr.ReadToEnd();
        string[] rows = allData.Split("\r".ToCharArray());

        foreach (string r in rows)
        {
            string[] items = r.Split(delimiter.ToCharArray());
            dataset.Tables[tableName].Rows.Add(items);
        }
        this.dataGridView1.DataSource = dataset.Tables[0].DefaultView;

    }

一个按钮会打开一个 window,其中包含用于向 csv 文件添加新条目的字段。我就是这样做的:

private void AddToScheduleBtn_Click(object sender, EventArgs e)
    {

        string FileName = @"F:\A2 Computing\C# Programming Project\ScheduleFile.csv";

        string AthleteDetails = textBox1.Text + "," + textBox2.Text;

        File.AppendAllText(FileName, AthleteDetails);

        AddToSchedule.ActiveForm.Close();


    }

虽然这一次有效,但当我尝试再次向我的 csv 文件添加另一个条目时,它说它在另一个进程中打开并且程序崩溃。当数据第一次出现在我的 datagridview 中时,底部有一个不应该有的空行。允许我重新使用该过程以便我可以多次附加到文件的最佳方法是什么?

我觉得你的台词,

StreamReader sr = new StreamReader(fileName);

文件已打开。您想执行以下操作:

string allData = sr.ReadToEnd();
sr.Close();
sr.Dispose();

我没有构建你的代码,但是当文件 reader 没有关闭时通常会出现这个错误:)

您应该将 sr.close() 添加到您的 LoadAthletes 方法或实现自动关闭的使用:

using (StreamReader sr = new StreamReader(fileName))
{
  allData = sr.ReadToEnd();
}

或使用以下方法:

allData = File.ReadAllText(fileName);

希望这个帮助

有关详细信息,请参阅此问题do-i-need-to-explicitly-close-the-streamreader-in-c-sharp-when-using-it-to-load