2013-09-21 3 views
1

У меня есть назначение Uni, и это только очень простое кодирование, но я должен сделатьStreamWriter и StreamReader

Пользователь должен иметь возможность хранить записи в файл. При запуске пользователь должен иметь возможность выбирать файл записей и загружать их в программу.

У меня возникли проблемы с этим, поскольку он будет сохранен, но как только я закрою программу и снова открою ее, они исчезнут, любая помощь будет оценена.

Это то, что я до сих пор:

private void Save_Click(object sender, EventArgs e) 
{ 

    SaveToFile(records, file); 
} 

private void SaveToFile(List<Client> records, string file) 
{ 

    //File.WriteAllText(file, String.Empty); 
    StreamWriter writer = new StreamWriter(file); 
    StreamReader reader = new StreamReader(file); 

    try 
    { 
     AddMember(); 

     for (int i = 0; i < records.Count; i++) 
     { 
      writer.WriteLine(records[i].WriteToFile()); 
     } 

     writer.Close(); 
    } 
    catch (IOException z) 
    { 
     MessageBox.Show("Error" + z); 
    } 
} 
+0

1. Вам не нужно 'StreamReader' в вашем методе SaveToFile (если вы также не читаете из файла). 2. Похоже, что вы можете перезаписать файл - попробуйте использовать «StreamWriter writer = новый StreamWriter (файл, true);' - второй параметр добавит новые данные в файл. – Tim

+0

Кроме того, можете ли вы опубликовать код для 'Client'? Мне интересно, что вы делаете в методе WriteToFile(). – Tim

ответ

0

Перед закрытием StreamWriter следует вызвать метод Flush(). Flush() Очищает все буферы для текущего автора и заставляет любые буферизованные данные записываться в базовый поток.

+1

Вызов 'Close()' также очищает буфер. – Tim

0
reader.clos(); 

Вы забыли это

+0

Да, OP должен закрыть читателя (на самом деле его даже не нужно использовать в методе сохранения), но это не решит проблему. – Tim

0

Это только предположение, но это звучит, как вы могли бы быть перезапись файла при запуске программы.

В вашем методе SaveToFile, у вас есть следующие две строки в начале:

StreamWriter writer = new StreamWriter(file); 
StreamReader reader = new StreamReader(file); 

Первый из них создаст новый файл с именем в file. Второй не нужен, если вы не читаете файл.

Теперь, если у вас есть аналогичный блок кода в другом месте вашей программы, который выполняется до вызова метода SaveToFile, он перезапишет файл (и поскольку вы, скорее всего, ничего не пишете в этой ранней части кода вы остаетесь с пустым файлом).

Чтобы не допустить этого, есть два предложения, которые я буду предлагать:

  1. только создать StreamWriter, когда вы собираетесь писать в файл. В любое другое время, когда вы создаете StreamWriter, вы будете перезаписывать существующий файл.

  2. Если вы не хотите, чтобы перезаписать файл, вы можете использовать перегрузку конструктора, который принимает второй параметр (булевой), чтобы указать, следует ли добавлять новые данные в файл:

    StreamWriter writer = новый StreamWriter (файл, true);

Кроме того, я предлагаю познакомиться и использовать using блоки, так как это будет заботиться о закрытии и промывке StreamWriter (и его основной поток) для вас, даже если исключение происходит и необработанное:

private void SaveToFile(List<Client> records, string file) 
{ 

    try 
    { 
     AddMember(); 

     // If you don't want to append but overwrite, use: 
     // using (StreamWriter writer = new StreamWriter(file)) 
     using (StreamWriter writer = new StreamWriter(file, append)) 
     { 

      for (int i = 0; i < records.Count; i++) 
      { 
       writer.WriteLine(records[i].WriteToFile()); 
      } 
     } 
    } 
    catch (IOException z) 
    { 
     MessageBox.Show("Error" + z); 
    } 
} 
Смежные вопросы