不要写入文本文件

本文关键字:文本 文件 | 更新日期: 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)
    {
    }
}