2016-01-26 7 views
3

в моем приложении Wpf Я использую класс Person (это базовый класс) и содержит виртуальный метод SaveData() и другой класс Client, который наследуется от Person. Как переопределить метод SaveData() и сохранить данные из базы?Как записать файл с помощью StreamWriter?

Класс Person

public virtual void SaveData() 
     { 
      string arqName = string.Format("Person{0}" + ".txt", Id); 
      StreamWriter file = new StreamWriter(arqNome); 
      file.WriteLine("ID: " + Id); 
      file.WriteLine("DOB: " + dOB); 
      file.WriteLine("Name: " + name); 
      file.WriteLine("Age: " + age); 
      file.Flush(); 
      file.Close(); 
     } 

Класс Client

public override void SaveData() 
     { 
      base.SaveData(); 
      string arqName = string.Format("Person{0}" + ".txt", Id); 
      StreamWriter file = new StreamWriter(arqNome); 
      file.WriteLine("Cod: " + cod); 
      file.WriteLine("Credits: " + credits); 
      file.Flush(); 
      file.Close(); 
     } 

Метод коррекции в клиенте действительно переопределить другие данные, как имя, возраст, DOB ... Мне нужно mantains как в одном файле.

ответ

8

StreamWriter - это декодер потока, поэтому лучше создать экземпляр FileStream и передать его конструктору StreamWriter. Таким образом, вы можете настроить его. Режим добавления открывает файл и перемещает указатель в конец файла, поэтому следующая надпись будет добавлена. И использовать using директиву InstEd явного вызова Close():
Person класс SaveData():

using (var fileStream = new FileStream(String.Format("Person{0}.txt", Id), FileMode.OpenOrCreate)) 
using (var streamWriter = new StreamWriter(fileStream)) 
{ 
    streamWriter.WriteLine("ID: " + Id); 
    streamWriter.WriteLine("DOB: " + dOB); 
    streamWriter.WriteLine("Name: " + name); 
    streamWriter.WriteLine("Age: " + age); 
} 

класса Client SaveData():

base.SaveData(); 
using (var fileStream = new FileStream(String.Format("Person{0}.txt", Id), FileMode.Append)) 
using (var streamWriter = new StreamWriter(fileStream)) 
{ 
    streamWriter.WriteLine("Cod: " + cod); 
    streamWriter.WriteLine("Credits: " + credits); 
} 
+0

Я считаю, что это не будет работать в качестве оригинального кода тоже. Потому что он перезапишет данные Person – Eugene

+0

@Eugene, спасибо, обновлено. – Verbon

2

Вы должны разделить его на 2 способами: SaveData() и WriteData(StreamWriter file). SaveData создает поток, а затем вызывает WriteData. Затем вы переопределяете только метод WriteDate, вызывающий базу.

+0

Можете ли вы показать мне простой пример? –

1

Ответ AlexDev верен. Но если вы не можете изменить код Person (и учитывая, что вы храните данные на файл), вы можете использовать флаг «добавить» для добавления данных в существующий файл. Но это не самая лучшая идея:

StreamWriter file = new StreamWriter(arqNome, append: true);