2015-02-19 1 views
0

Я пытаюсь разрешить пользователю добавлять еще одну запись в файл CSV, который создает моя программа. Он строит его из базы данных, как это:C# 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); 
    } 

я тогда зову его в DataGridView, как это:

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; 

    } 

кнопка открывает окно, которое содержит поля для добавления новой записи в файл 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, в нижней части есть пустая строка, которой не должно быть. Каков наилучший способ разрешить мне повторное использование процесса, чтобы я мог добавлять его в файл более одного раза?

+0

где вы 'Промывка файл, а также закрытие файла, как только вы добавите data'? – MethodMan

+0

Я могу только предположить, что им нет, как бы я это сделал? –

+0

вам нужно закрыть FileStream, в вашем случае это 'sr.Close();' но я бы сделал 'sr.Flush()', затем вызовет 'sr.Close()', затем вызовет 'sr.Dispose()' – MethodMan

ответ

3

Я думаю, свою линию,

StreamReader sr = new StreamReader(fileName); 

открыл файл. Вы хотите сделать следующее:

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

Или [File.ReadAllLines] (https://msdn.microsoft.com/library/s2tte0y1.aspx) (что соответствует уже используемому 'File.WriteAllLines'). – Corak

1

Я не строить свой код, но эта ошибка обычно возникает, когда читатель файл не был закрыт :)

Вы должны добавить 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