0

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

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

3 回答 3

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);
}
于 2013-01-10T04:25:55.400 回答
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但不要关闭它,这会导致问题。因此,可以使用方便的 using 语句来防止这种情况发生。否则,您只需要关闭您的 filstream 或任何非托管资源。

于 2013-01-10T04:27:44.320 回答
0

我发现了原因。

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

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

于 2013-01-10T19:27:30.537 回答