ファイル操作にStreamWriter
クラスを使用していますが、このコードに表示されていない問題はありますか?
try catch finally
ブロックに入れる必要がありますか?
StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();
コードの何が問題になっていますか?ストリームを閉じる前に何らかの例外が発生した場合、ストリームは開いたままになり、システムリソースは解放されません。
_StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();
_
したがって、そのストリームが閉じられることを確認する必要があります。これは、_try...finally
_ブロックによって実現できます。
_StreamWriter sr = new StreamWriter(streamFolder);
try
{
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
finally
{
sr.Close();
}
_
ただし、StreamWriterは IDisposable インターフェイスを実装しているため、ライターの使用状況をusing
ブロックにラップすることで、C#コンパイラに自動的に実行させることができます。
_using(StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
_
このコードは次のようにコンパイルされます。
_StreamWriter sr = new StreamWriter(streamFolder);
try
{
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
finally
{
if (sr != null)
sr.Dispose();
}
_
手動実装の唯一の違いはnullチェックであり、メソッドDispose
がClose
の代わりに呼び出されます。ただし、実際にはClose()
またはDispose()
を呼び出すと、同じコードが実行されます。
_this.Dispose(true);
GC.SuppressFinalize(this);
_
詳細については、 メソッドの実装を破棄 を参照してください。
おそらくusingステートメントを使用する必要があります。
using (StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
Usingブロックの最後に、例外があったかコードが正常に実行されたかに関係なく、StreamWriter.Disposeが呼び出されます。
使用したい:
using (StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
Close
は必要ありません。
using
ブロックでラップします
using(StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
名前が適切であることを確認してください。したがって、streamFolder
はおそらくfName
であるはずです。いくつかのIO(または他の)例外)を処理できると思われる場合は、このコードをtry-catch-finallyに入れることもできます。
StreamWriter sr;
try
{
sr = new StreamWriter(streamFolder);
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
catch(IOException ex)
{
//handling IO
}
finally
{
if (sr != null)
sr.Dispose();
}