StreamWriter has a Bug?

本文关键字:Bug has StreamWriter | 更新日期: 2023-09-27 17:51:07

这只是将文本框中的文本每次写入同一个文件…我不明白为什么它工作完美,如果我输入新的字符或改变字符,而删除字符不工作…

 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);
        }

StreamWriter has a Bug?

您没有关闭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);
}

简而言之:您需要像以下示例一样通过using关键字重新编写代码。因为它可以防止泄漏,并且是处理。net框架中非托管资源的推荐方法。

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
}

Edit:在您的代码示例中,您打开了FileStream,但没有关闭它,这会导致问题。因此,使用方便的using语句来防止这种情况的发生是一种可行的方法。否则,您只需要关闭您的filstream或任何非托管资源。

我找到原因了。

我使用的StreamWriter构造函数不能将属性"append"设置为false,所以每次我都重写现有的文本,而不是从头开始。

由于我必须使用FileStream多线程的原因,我想我必须找到另一种方式来写文件