web-dev-qa-db-ja.com

StreamWriterを使用してファイルに書き込む方法

私のWPFアプリでは、Personクラス(基本クラス)を使用しています。これには、仮想メソッドSaveData()と、Personから継承する他のクラスClientが含まれています。メソッドSaveData()をオーバーライドし、ベースからデータを保持する方法は?

クラスの人

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();     
}

クラスクライアント

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();
}

Clientのオーバーライドメソッドは、実際には他のデータをName、Age、DOBとしてオーバーライドしています...同じファイルで両方を管理する必要があります。

6
Wesley Heron

StreamWriterはストリームデコレータであるため、FileStreamをインスタンス化してStreamWriterコンストラクタに渡す方が適切です。したがって、それをカスタマイズできます。追加モードはファイルを開き、ポインタをファイルの最後に移動するため、次に書き込むものが追加されます。そして、明示的にClose()を呼び出すのではなく、usingディレクティブを使用します。
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);
}

クライアントクラス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);
}
13
Verbon

それを2つのメソッドに分割する必要があります:SaveData()WriteData(StreamWriter file)SaveDataはストリームを作成してからWriteDataを呼び出します。次に、WriteDateメソッドのみをオーバーライドして、ベースを呼び出します。

3
AlexDev

AlexDevの答えは正しいです。ただし、Personコードを変更できない場合(およびファイルごとにデータを保存する場合)、「追加」フラグを使用して、既存のファイルにデータを追加できます。しかし、それは最良のアイデアではありません。

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