所以我正在为我和我的朋友制作聊天程序。我在编写消息时遇到问题,当我编写消息时,整个文本文件被新消息替换。这是我的代码:
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
{
}
}
答案 0 :(得分: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 对象一起使用。 (streams实现 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...
}
这样做的好处是在处理实际异常之前已经释放了文件句柄(如果处理不当,可能会抛出异常,具体取决于你在那里做什么)。
答案 1 :(得分:0)
您是否对文本框中的每个文本更改使用此方法? 如果是这样,这将超出您的申请。 我建议您在输入时使用此方法或将此聊天消息发送到单独的线程
答案 2 :(得分:0)
您的想法中存在一些问题:
我看到你在文本框的TextChanged事件中这样做了。每次输入一个字母或删除一个字母时,您都会将文本框的全部内容写入该文件。 我建议当用户按Enter键或其他键时,只在文件中写入一行文字。
创建新的StreamWriter会覆盖您的文件。要将文本附加到文件,您可以使用:
using (StreamWriter sw = File.AppendText(path)) { sw.WriteLine(); }