0

これをフォームに作成しました。すべての情報を受け取って動作しているように見えますが、テキスト ファイルを確認するとそこには何も書き込まれておらず、フォームを 2 回しか実行できずにエラーが発生します。誰もが問題を見ますか?

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 に答える