あるファイルストリームからデータを読み取り、別のファイルストリームに書き込むクラスがあります。closeFiles()での処理が終了した後、ストリームを閉じることが心配です。
一方のストリームの破棄が例外をスローして、もう一方のストリームの破棄が呼び出されないようにする可能性をどのように処理しますか?
私は近くに電話して小川に処分するべきですか、それとも1つだけですか?
ストリームの破棄からエラーをキャッチし、lastOperation()に示すようにファイルの移動と削除を続行するとどうなりますか?
完璧な世界では、c ++スタイルの初期化リストでusingステートメントを使用したいのですが、c#ではそれが不可能であると確信しています。
編集:迅速な対応の人に感謝します。したがって、私がすべきことは、IDisposableから派生し、コンストラクターを変更して、次のような2つの破棄メソッドを追加することです。
~FileProcessor()
{
Dispose(true);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
sw.Flush();
}
closeFiles();
disposed = true;
}
}
これは基本的に私がしていることです:
class FileProcessor
{
private string in_filename;
private string out_filename;
private StreamReader sr;
private StreamWriter sw;
bool filesOpen = false;
public FileProcessor(string filename)
{
in_filename = filename;
out_filename = filename + ".out";
openFiles();
}
~FileProcessor()
{
closeFiles();
}
private void openFiles()
{
sr = new StreamReader(in_filename);
sw = new StreamWriter(out_filename);
filesOpen = true;
}
private void closeFiles()
{
if (filesOpen)
{
sr.Close();
sw.Close();
sr.Dispose();
sw.Dispose();
filesOpen = false;
}
}
/* various functions to read, process and write to the files */
public void lastOperation()
{
closeFiles();
File.Delete( in_filename );
Directory.Move(out_filename, outdir + out_filename);
}
}