不要写入文本文件
本文关键字:文本 文件 | 更新日期: 2023-09-27 18:14:58
我已经创建了一个表单。如果接收到所有的信息,似乎工作,但当我检查文本文件没有写在那里,它只让我运行表单两次错误之前。有人发现问题了吗?
const string FileName = "Friends.txt";
Friend friend = new Friend();
FileStream file = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
FileStream file2 = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
public Form1()
{
InitializeComponent();
}
private void enter_Click(object sender, EventArgs e)
{
StreamWriter write = new StreamWriter(file2);
try
{
friend.FirstName = firstName.Text;
friend.LastName = lastName.Text;
friend.PhoneNumber = phoneNumber.Text;
friend.Month = Convert.ToInt32(birthMonth.Text);
friend.Day = Convert.ToInt32(birthday.Text);
write.WriteLine(friend.ToString());
MessageBox.Show("Wrote " + friend.ToString() + " to file.");
}
catch(Exception error)
{
MessageBox.Show(error.Message + " Please reenter the information.");
}
firstName.Clear();
lastName.Clear();
phoneNumber.Clear();
birthMonth.Clear();
birthday.Clear();
write.Close();
file2.Close();
}
你不能用那样的文件。它们只在类实例化时被打开一次。然后在enter_Click()
结束时关闭文件,所以下次调用enter_Click()
时,文件已关闭并且失败。
在 enter_Click()
中创建文件,以便每次调用时打开和关闭。
您应该使用using
关键字来确保即使发生异常也关闭它们。
你的代码应该看起来像这样:
private void enter_Click(object sender, EventArgs e)
{
using (FileStream file2 = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (StreamWriter write = new StreamWriter(file2))
{
try
{
friend.FirstName = firstName.Text;
friend.LastName = lastName.Text;
friend.PhoneNumber = phoneNumber.Text;
friend.Month = Convert.ToInt32(birthMonth.Text);
friend.Day = Convert.ToInt32(birthday.Text);
write.WriteLine(friend.ToString());
MessageBox.Show("Wrote " + friend.ToString() + " to file.");
}
catch (Exception error)
{
MessageBox.Show(error.Message + " Please reenter the information.");
}
firstName.Clear();
lastName.Clear();
phoneNumber.Clear();
birthMonth.Clear();
birthday.Clear();
}
}
}
还有一种方法可以处理这个问题—您可以只打开文件一次,并且只在类被处置时关闭它。然后,你可以继续添加文件,而不必重新打开和关闭它。
我不建议那样做。这样会更有效率,但也更容易出错,而且如果你的程序崩溃了,文件可能有数据没有写入,这可能会破坏文件。
最好是安全起见,保持打开和关闭文件,除非你要写一个很多的数据到它;只有在这种情况下,您才可能需要考虑这种替代方法。
您需要冲洗和/或关闭流写入器,并且您也应该处理它。处理这一切的最好方法是使用using
语句:
using(var write = new StreamWriter(file2)
{
//... your code
}
正如@Matthew Watson所说,你也不应该在表单中将FileStream对象创建为全局对象。在click事件中创建它们,并将文件流也放在using语句中:
using(var file2 = new FileStream("Friends.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)
{
using(var write = new StreamWriter(file2)
{
}
}