Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StreamWriter有Bug吗?_C# - Fatal编程技术网

C# StreamWriter有Bug吗?

C# StreamWriter有Bug吗?,c#,C#,这只是每次将文本框中的文本写入同一个文件…我不明白如果我输入新字符或更改字符而删除字符不起作用,为什么它工作得很好 private void ContentChanged(object sender, TextChangedEventArgs e) { Console.WriteLine("cur before:" + this.Box.SelectionStart); FileStream f = File.Open(path,

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

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

您没有关闭
f
或刷新-完全有可能数据正在被缓冲,这就是为什么它从未进入文件

两项建议:

  • 语句与流和写入器等可支配资源一起使用
  • 用于在一次通话中创建一个
    TextWriter
    ——或者更好的是,使用它可以避免担心打开和关闭
比如说:

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

您没有关闭
f
或刷新-完全有可能数据正在被缓冲,这就是为什么它从未进入文件

两项建议:

  • 语句与流和写入器等可支配资源一起使用
  • 用于在一次通话中创建一个
    TextWriter
    ——或者更好的是,使用它可以避免担心打开和关闭
比如说:

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

简而言之:您需要使用
关键字重新编写代码,如以下示例所示。因为它可以防止泄漏,并且是在.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
}

编辑:在您的代码示例中,您正在打开
文件流,但不要关闭它,这会导致问题。因此,通过使用方便的语句来防止这种情况的发生是一种可行的方法。否则,您只需要关闭filstream或任何未管理的资源

简而言之:您需要使用
关键字重新编写代码,如以下示例所示。因为它可以防止泄漏,并且是在.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
}
编辑:在您的代码示例中,您正在打开
文件流,但不要关闭它,这会导致问题。因此,通过使用方便的语句来防止这种情况的发生是一种可行的方法。否则,您只需要关闭filstream或任何未管理的资源

我找到了原因

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

由于多线程的原因,我不得不使用FileStream,我想我必须找到另一种编写文件的方法。

我找到了原因

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


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

我说的“不工作”是指它似乎没有将新字符串写入文件。但它在控制台中显示了正确的内容。当您说删除不起作用时,您是否尝试过从文本框的开头和结尾同时删除?我的猜测是,您正在从末尾删除,并且以前文件中的文本不会被覆盖,但是从开头删除会导致文件末尾保留一些不正确的字符。我说的“不工作”是指它似乎没有将新字符串写入文件。但它在控制台中显示了正确的内容。当您说删除不起作用时,您是否尝试过从文本框的开头和结尾同时删除?我猜您是从末尾删除,以前文件中的文本不会被覆盖,但从开头删除会导致文件末尾保留一些不正确的字符。谢谢您的建议,但这对我的情况不起作用。我的程序要求多个线程同时访问同一个文件,因此file.writealText无法工作。我还尝试使用并关闭/释放f…不幸的是,没有worked@user1447343:鉴于您正在快速打开和关闭文件,我强烈建议您坚持一次一个线程访问文件,使用锁定。除此之外,这甚至可能是您遇到问题的原因。此程序的要点是允许用户(多线程)同时访问文件和编辑文件…谢谢您的建议,但它对我的情况不起作用。我的程序要求多个线程同时访问同一个文件,因此file.writealText无法工作。我还尝试使用并关闭/释放f…不幸的是,没有worked@user1447343:鉴于您正在快速打开和关闭文件,我强烈建议您坚持一次一个线程访问文件,使用锁定。除此之外,这甚至可能是您遇到问题的原因。此程序的要点是允许人员(多线程)要访问文件并同时编辑它,请执行以下操作…同一问题…无法写入比其长度短的字符串相同问题…无法写入比其长度短的字符串这无法解释您对未将字符串写入文件的描述。它会将字符串写入文件,但只会覆盖其他所有内容。(您从未说过要添加值。这是一个很好的例子,说明编写清晰的问题有多么重要。)此外,我仍然建议您尽量避免同时从多个线程编写。同步访问,或者有一个线程,其唯一任务是写入此文件,并从其他线程添加到的生产者/消费者集合中获取数据。这并不能解释您对不将字符串写入文件的描述。它会将字符串写入文件,但只会覆盖其他所有内容。(您从未说过要添加值。这是一个很好的例子,说明写一个明确的问题是多么重要。)此外,我仍然建议您尽量避免从