不会写入文本文件

时间:2013-05-22 20:36:34

标签: c# winforms file filestream streamwriter

我已将其创建为表单。如果接收到所有信息并且似乎工作,但是当我检查文本文件时没有写入任何内容,并且它只允许我在错误输出之前运行表单两次。有人看到问题吗?

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

2 个答案:

答案 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)
    {

    }
}