-1

だから私と私の友人のためのチャット プログラムを作っています。メッセージの書き込みに問題があります。メッセージを書き込むと、テキスト ファイル全体が新しいメッセージに置き換えられます。これが私のコードです:

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        String write = textBox1.Text;
        try
        {
            StreamWriter sw = new StreamWriter(@"Path.txt");
            sw.WriteLine(write);
            sw.Close();
        }
        catch (Exception w)
        {
            Console.WriteLine("Exception: " + w.Message);
        }
        finally
        {
        }
    }
4

3 に答える 3

1

try ブロック内で sw.Close() を実行しないでください。I/O コードが例外をスローした場合、ファイルはアプリケーションが終了するまで開いたままになります (ロックされている可能性があります)。

usingステートメントを使用すると、このような状況にうまく対処できます。


ファイルに文字列を追加するコード例:

using (StreamWriter sw = new StreamWriter(@"Path.txt", true))
{
    sw.WriteLine(write);
}

これは、次の C# の省略形です。

StreamWriter sw = new StreamWriter(@"Path.txt", true);
try
{
    sw.WriteLine(write);
}
finally
{
    sw.Close();
}

実際には、実装方法はIDisposableusingオブジェクトで機能します。(ストリームはIDisposableインターフェイスを実装します)。また、暗黙の finally ブロックで Close() メソッドを呼び出すのではなく、Dispose() メソッドを呼び出します。ただし、Dispose() メソッドが呼び出されると、ストリームはストリームを閉じます (erm...)。using

つまり、 IDisposableオブジェクトの有効期間を制御する必要があるときはいつでも、using可能な限り使用してください。


しかし、話題に戻ります。例外処理... 同じメソッド内で I/O 例外処理を行うか、呼び出し元のメソッドの 1 つに例外を処理させることができます。

メソッド自体が例外を処理する必要がある場合は、次のようにします。

try
{
    using (StreamWriter sw = new StreamWriter(@"Path.txt", true))
    {
        sw.WriteLine(write);
    }
}
catch (Exception ex)
{
    // Exception handling here...
}

これには、実際の例外が処理される前にファイル ハンドルが既に解放されているという利点があります (適切に処理されていない場合、そこでの操作によっては例外もスローされる可能性があります)。

于 2013-10-20T19:39:38.980 に答える
0

テキスト ボックスのテキストを変更するたびにこのメソッドを使用しますか? その場合、これはアプリケーションにオーバーヘッドされます。エンタープレスでこの方法を使用するか、このチャットメッセージを別のスレッドに送信することをお勧めします

于 2013-10-20T19:35:11.067 に答える
0

あなたのアイデアのいくつかの問題:

  1. テキストボックスの TextChanged イベントでこれを行っていることがわかります。文字を入力または削除するたびに、テキストボックスの内容全体がファイルに書き込まれます。ユーザーが Enter キーまたはその他のキーを押したときにのみ、テキスト行をファイルに書き込むことをお勧めします。

  2. 新しい StreamWriter を作成すると、ファイルが上書きされます。ファイルにテキストを追加するには、これを使用できます。

    使用 (StreamWriter sw = File.AppendText(パス))
    {
        sw.WriteLine();
    }
    
于 2013-10-20T22:40:50.770 に答える