我试图编写一个保持开放StreamWriter
的类,直到实例化的对象被销毁 - 这是为了避免正常的using
成语,因为外部源不编辑很重要程序运行时的文件(因此FileShare.Read
)。
实例化后,通过构造函数成功创建文件。调用Write
方法实际上并没有写任何内容,也没有抛出异常。一旦对象被销毁,析构函数就会在sw.Close()
Cannot access a closed file.
上抛出异常,即使BaseStream
不是null
。我不确定我理解这个原因。
这个question遵循一些类似的方法,但在其他类型的类中。所以我认为这种方法应该有效,但无法确定原因。
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");
}
}
答案 0 :(得分:3)
GC已经声明了(并已将其处理掉)。
你唯一应该做的就是实施IDisposable
。执行以下操作:
class SchemaWriter : IDisposable
{
private StreamWriter sw;
public void Dispose()
{
sw.Dispose();
}
...
}
您现在可以将对象用于:
using(var writer = new SchemaWriter())
{
}
这将在您完成对象后立即关闭StreamWriter
。如果您不使用using
,GC会在您感觉到时为您收集StreamWriter
。
答案 1 :(得分:1)
您使用的原因之一是using
阻止StreamReaders
/ Writers
被缓冲,这样他们就不必为写入的每个字节重新访问硬盘驱动器。这意味着在您致电StreamWriter.Flush
之前,您可能看不到您的数据实际输出到磁盘。
我仍然建议使用using
块,但只需使用'leave open'覆盖。参见: