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たりフラッシュしたりしているわけではありません。データがバッファリングされている可能性があります。そのため、データがファイルに保存されることはありません。

2つの提案:

  • usingストリームやライターなどの使い捨てリソースでステートメントを使用する
  • を使用して1回の呼び出しFile.CreateTextを作成します。さらに良いのは、開閉についてまったく心配する必要がないようにするために使用することです。TextWriterFile.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、次のサンプルのようにキーワードでコードを書き直す必要があります。リークを防ぎ、.NETFrameworkで管理されていないリソースを処理するための推奨される方法です。

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: In your code sample you are opening the FileStream but do not close it, which causes the issues. Thus, preventing that with a convenient using statement is proffered way to go. Otherwise, you just need to close your filstream or any un-managed resources.

于 2013-01-10T04:27:44.320 に答える
0

理由がわかりました。

私が使用したStreamWriterコンストラクターは、属性「append」をfalseに設定できなかったため、最初からではなく、既存のテキストをオーバーライドするたびに。

マルチスレッドの理由でFileStreamを使用する必要があるため、ファイルを書き込む別の方法を見つける必要があると思います。

于 2013-01-10T19:27:30.537 に答える