我已将其创建为表单。如果接收到所有信息并且似乎工作,但是当我检查文本文件时没有写入任何内容,并且它只允许我在错误输出之前运行表单两次。有人看到问题吗?
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();
}
答案 0 :(得分:5)
你不能使用那样的文件。只有在实例化类时才会打开它们。然后在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();
}
}
}
您可以处理此方法的另一种方法 - 您只能打开一次文件,并且只在处理该类时关闭它。然后你可以继续追加到文件,而不必继续重新打开和关闭它。
我不建议这样做。它会更有效率,但它更容易出错,如果你的程序崩溃,那么文件可能会有数据没有写入它 - 这可能会破坏文件。
安全地播放它并保持打开和关闭文件要好得多,除非你正在为它写一个 lot 数据;只有这样你才能考虑这种替代方式。
答案 1 :(得分:0)
你需要刷新和/或关闭你的编写器,你也应该真正处理它。
处理所有这些的最佳方法是使用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)
{
}
}