StreamWriter有Bug吗?

时间:2013-01-10 04:23:10

标签: c#

这简单地每次都将文本框中的文本写入同一个文件...我不明白为什么它在输入新字符或更改字符时完美无缺,而删除字符则不起作用...

 private void ContentChanged(object sender, TextChangedEventArgs e)
        {
            Console.WriteLine("cur before:" + this.Box.SelectionStart);
            FileStream f = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
            StreamWriter writer = new StreamWriter(f);
            model.Cursor = this.Box.SelectionStart;
            writer.Write(this.Box.Text);
            writer.Close();
            Console.WriteLine("cur after:" + this.Box.SelectionStart);
            Console.WriteLine("write:" + count++);
            Console.WriteLine("after write:" + this.Box.Text);
            Console.WriteLine("after write:" + model.Content);
        }

3 个答案:

答案 0 :(得分:4)

你没有关闭f或刷新 - 数据被完全缓存,这就是为什么它永远不会进入文件。

两个建议:

  • using语句与流和作者等可支配资源一起使用
  • 使用File.CreateText在一次通话中创建TextWriter - 或者更好的是,使用File.WriteAllText以避免担心打开和关闭。

这样的事情:

private void ContentChanged(object sender, TextChangedEventArgs e)
{
    Console.WriteLine("cur before:" + this.Box.SelectionStart);
    File.WriteAllText(path, this.Box.Text);
    Console.WriteLine("cur after:" + this.Box.SelectionStart);
    Console.WriteLine("write:" + count++);
    Console.WriteLine("after write:" + this.Box.Text);
    Console.WriteLine("after write:" + model.Content);
}

答案 1 :(得分:0)

简而言之:您需要通过using关键字重新编写代码,如下例所示。因为它可以防止泄漏,并且是在.NET Framework中处理未受管资源的推荐方法。

using(StreamWriter writer = new StreamWriter(Response.OutputStream))
{
    writer.WriteLine("col1,col2,col3");
    writer.WriteLine("1,2,3");
    writer.Close(); //not necessary I think... end of using block should close writer
}

修改:在您的代码示例中,您打开FileStream但不要关闭它,这会导致问题。因此,使用方便的使用语句来防止这种情况是有必要的。否则,您只需关闭您的filstream或任何未管理的资源。

答案 2 :(得分:0)

我发现了原因。

我使用的StreamWriter构造函数无法将属性“append”设置为false,因此每次我都覆盖现有文本,而不是从头开始。

由于我必须使用FileStream来解决多线程问题,我想我必须找到另一种编写文件的方法。