我如何重启StreamWriter onced它已被使用?

时间:2014-10-13 13:15:06

标签: c# streamwriter

我正在使用Streamwriter方法单击按钮来运行测试,但在测试完成后我想再次运行它并将结果记录在同一文本文件中。

即使先前的测试已经完成,我总是收到一个错误,即文件仍在另一个进程中。我已经尝试过使用.Close(),然后我得到一个"不能写给封闭的文本作者"错误信息。

 StreamWriter ResultsFile = new StreamWriter(FileName, true);

    public void ToFile()
    {
        ResultsFile.AutoFlush = true;
        Console.SetOut(ResultsFile);
        Console.WriteLine("Regression Test Performed at {0}", thisDate);
        Console.WriteLine("-----");

    }

   [Test]
    public void NewTextFile()
    {
        ToFile();
        const int requiredNumber = 5;
        for (var i = 0; i < requiredNumber; i++)
        {
            Console.WriteLine("New ID assigned to ABC");
            Console.WriteLine("-----");
         }
     }

1 个答案:

答案 0 :(得分:2)

您不应该像这样重用StreamWriter,请尝试以下方法。

public void ToFile(StreamWriter sw)
{
    sw.AutoFlush = true;
    Console.SetOut(sw);
    Console.WriteLine("Regression Test Performed at {0}", thisDate);
    Console.WriteLine("-----");
}


[Test]
public void NewTextFile()
{
    using (var sw = new StreamWriter(FileName, true))
    {
        ToFile(sw);
        const int requiredNumber = 5;
        for (var i = 0; i < requiredNumber; i++)
        {
            Console.WriteLine("New ID assigned to ABC");
            Console.WriteLine("-----");
        }
    }
}

可以找到using的解释here。我还建议你阅读IDisposable interface

请注意,在退出using语句后,调用Console.WriteLine将导致ObjectDisposedException,因为您将尝试写入已处理的流。为了防止出现这种情况,您可以在输入Console.Out语句之前将using的返回值缓存到本地变量中,退出using语句后,您可以通过再次调用SetOut来缓存状态原始流的价值,即:

var original = Console.Out;
using (var sw = new StreamWriter(FileName, true))
{
    // ...
}
Console.SetOut(original);