0

我已经将它创建为一个表单。如果收到所有信息并且似乎可以工作,但是当我检查文本文件时,那里没有写任何东西,它只让我在出错之前运行表单两次。有人看到问题了吗?

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

2 回答 2

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

您可以使用另一种方法来处理此问题 - 您可以只打开一次文件,并仅在处理类时关闭它。然后,您可以继续附加到文件,而不必继续重新打开和关闭它。

建议这样做。它会更有效率,但更容易出错,如果你的程序崩溃,文件可能会有数据未写入的危险——这可能会损坏文件。

除非您要向其中写入大量数据,否则最好安全地玩它并继续打开和关闭文件;只有这样,您才可能想考虑这种替代方式。

于 2013-05-22T20:39:04.770 回答
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)
    {

    }
}
于 2013-05-22T20:38:14.000 回答