0

私はインターネットを検索し、多くの投稿を見ましたが、どれも私を助けませんでした. そこで、ここで自分の質問をすることにしました。

フォームの保存ボタンがクリックされたときにバイナリファイルにデータを書き込み、フォームからファイルが開かれたときにファイルからそのデータを読み取ります。データには、いくつかのテキスト ボックスと 2 つのリストからのテキストが含まれます。次のコードを持つ保存メソッドを作成しました。

BinaryWriter writer = new BinaryWriter(new FileStream(savedFileName, FileMode.Create, FileAccess.Write));
        writer.Write(Database.firstName);
        writer.Write(Database.middleName);
        writer.Write(Database.lastName);
        writer.Close();

次のコードを持つリストを作成する別の一般的な方法があります。

private void writeDGVrowListToBinaryFile(List<DGVrow> list, BinaryWriter R)
        {
            Nrows = list.Count;
            R.Write(Nrows);
            for (int i = 0; i < Nrows; i++)
            {
                DGVrow dgvr = list[i];
                R.Write(dgvr.Day);
                R.Write(dgvr.FromTime);
                R.Write(dgvr.ToTime);
            }
            R.Close();
        }

リストが 2 つあるため、次の 2 行を Save メソッドのwriter.Close()行の前に追加し、最初のコードを次のように変更します。

BinaryWriter writer = new BinaryWriter(new FileStream(savedFileName, FileMode.Create, FileAccess.Write));
writer.Write(Database.firstName);
writer.Write(Database.middleName);
writer.Write(Database.lastName);
writeDGVrowListToBinaryFile(Database.officeHoursList, writer);
writeDGVrowListToBinaryFile(Database.classScheduleList, writer);
writer.CLose();

問題は、コードが に到達するR.Write(Nrows);と、 がスローObjectDisposedExceptionされ、閉じられたファイルにアクセスできないと表示されることです。この時点でファイルが閉じられる原因は何ですか? また、ファイルが閉じないようにするにはどうすればよいですか?

読み取りは書き込みと同じパターンを使用するため、読み取り中に同じ問題が発生します。

4

2 に答える 2

1

R.Close();内から削除するwriteDGVrowListToBinaryFileと、ファイルが早期に閉じられます。

于 2015-05-31T09:10:10.897 に答える
1

この時点でファイルが閉じられる原因は何ですか?

R.Close()への呼び出しwriteDGVrowListToBinaryFile。そのメソッドでライターを閉じるべきではありません。メソッドに渡されたファイル ハンドル (または他の破棄可能なリソース) を閉じたいと思うことはほとんどありません。通常は、ハンドルを取得し、それを使用し (おそらく他のメソッドに渡します)、それから閉じます。すべて同じメソッド内で行います。また、例外がスローされた場合でもファイルが閉じusingられるようにステートメントを使用することをお勧めします。

using (var writer = new BinaryWriter(...))
{
    writer.Write(Database.firstName);
    writer.Write(Database.middleName);
    writer.Write(Database.lastName);
    writeDGVrowListToBinaryFile(Database.officeHoursList, writer);
    writeDGVrowListToBinaryFile(Database.classScheduleList, writer);
}

また、命名を再検討することを強くお勧めします-パラメーター(型にRはまら、明白な意味はありません)とメソッド名(writeDGVrowListToBinaryFile型にはまらない-どうWriteRowListですか?BinaryWriterそれに書き込みます..)

于 2015-05-31T09:09:35.803 に答える