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

实际上,它的实现方式using适用于IDisposable对象。(流实现IDisposable接口)。并且using不调用隐式 finally 块中的 Close() 方法,而是调用 Dispose() 方法。但是,当调用 Dispose() 方法时,流会关闭流 (erm...)。

简而言之,只要您必须控制IDisposable对象的生命周期,请using尽可能使用。


但回到主题。异常处理... 您可以在同一个方法中进行 I/O 异常处理,或者让调用方法之一来处理异常。

如果方法本身应该处理异常,请这样做:

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

你的想法有几个问题:

  1. 我看到您在文本框的 TextChanged 事件中执行此操作。每次输入或删除一个字母时,您都将文本框的全部内容写入文件。我建议只在用户按 Enter 或其他键时向文件写入一行文本。

  2. 创建新的 StreamWriter 会覆盖您的文件。要将文本附加到文件中,您可以使用以下命令:

    使用 (StreamWriter sw = File.AppendText(path))
    {
        sw.WriteLine();
    }
    
于 2013-10-20T22:40:50.770 回答
0

您是否对文本框上的每个文本更改都使用此方法?如果是这样,这将超出您的应用程序。我建议您应该在输入时使用此方法或将此聊天消息发送到单独的线程

于 2013-10-20T19:35:11.067 回答