0

我试图编写一个保持打开状态的类,StreamWriter直到实例化的对象被破坏——这是为了避免正常的using习惯用法,因为在程序运行时外部源不要编辑文件很重要(因此FileShare.Read)。

实例化后,通过构造函数成功创建文件。对该方法的调用Write实际上并不写任何东西,也不会抛出异常。sw.Close()一旦对象被销毁,析构函数会在of上抛出异常Cannot access a closed file.,即使BaseStreamis not 也是如此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");
    }
}
4

2 回答 2

3

GC 已经认领了它(并处置了它)。您唯一应该做的就是实施IDisposable. 请执行下列操作:

class SchemaWriter : IDisposable
{
    private StreamWriter sw;

    public void Dispose()
    {
       sw.Dispose();
    }

    ...
}

您现在可以将您的对象用于:

using(var writer = new SchemaWriter())
{
}

StreamWriter完成对象后,这将立即关闭。如果您不使用GC,GC 会在您需要时为您using收集。StreamWriter

于 2013-02-07T17:24:27.503 回答
1

您应该使用using块的原因之一是StreamReaders/Writers被缓冲,因此它们不必为写入的每个字节重新访问硬盘驱动器。这意味着在您调用StreamWriter.Flush.

我仍然建议使用这些using块,但只需使用“保持打开”覆盖。看:

http://msdn.microsoft.com/en-us/library/gg712853.aspx

于 2013-02-07T17:09:55.523 回答