我搜索过互联网并浏览过很多帖子,但没有人帮助过我。所以我决定在这里问自己的问题。
当我单击表单上的保存按钮时,我正在将一些数据写入二进制文件,并在从表单打开文件时从文件中读取该数据。数据包括来自某些文本框和两个列表的文本。我创建了一个save方法,其中包含以下代码:
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();
}
因为我有两个列表,所以我将这两行添加到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
并说它无法访问已关闭的文件。是什么导致文件在此时关闭?我怎样才能阻止文件关闭?
阅读时会出现同样的问题,因为阅读使用与写作相同的模式。
答案 0 :(得分: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
,所以应该很明显它会写入它......)
答案 1 :(得分:1)
从R.Close();
中移除writeDGVrowListToBinaryFile
,导致文件提前关闭。