インスタンス化されたオブジェクトが破棄されるまで開いたままになるクラスを作成しようとしました。これは、プログラムの実行中に外部ソースがファイルを編集しないことが重要であるStreamWriter
ため、通常のイディオムを回避するためです(したがって)。 using
FileShare.Read
インスタンス化されると、ファイルはコンストラクターを介して正常に作成されます。メソッドの呼び出しWrite
は実際には何も書き込まず、例外もスローしません。オブジェクトが破棄されると、デストラクタはの例外をスローしますが、sw.Close()
はそうではありません。その理由がよくわかりません。Cannot access a closed file.
BaseStream
null
この質問は、いくぶん似たアプローチに従いますが、他のタイプのクラスです。したがって、このアプローチは機能するはずだと思いましたが、機能しない理由を特定できませんでした。
class SchemaWriter
{
private StreamWriter sw;
private string path;
/// <summary>
/// Creates an object to handle writing Schema.ini information
/// </summary>
/// <param name="Path">Path to place Schema.ini file in</param>
public SchemaWriter(string Path)
{
path = Path;
sw = new StreamWriter(File.Open(Path + "Schema.ini", FileMode.Create,
FileAccess.ReadWrite, FileShare.Read));
}
/// <summary>
/// Writes Schema information about the supplied file name
/// </summary>
/// <param name="FileName">Name of file to write the Schema info about</param>
public void Write(string FileName)
{
sw.WriteLine(String.Format(@"[{0}]", FileName));
sw.WriteLine(@"Format=TabDelimited");
sw.WriteLine();
}
/// <summary>
/// Closes StreamWriter, deletes ini file
/// </summary>
~SchemaWriter()
{
if(sw.BaseStream != null)
sw.Close();
File.Delete(path + @"Schema.ini");
}
}