在 Reading/Writing 操作期间无法访问已关闭的文件 - C#
Cannot access closed file during Reading/Writing operation - C#
我在互联网上搜索并查看了很多帖子,但 none 对我有所帮助。所以我决定在这里问我自己的问题。
我在单击表单上的保存按钮时将一些数据写入二进制文件,并在从我的表单打开文件时从文件中读取该数据。数据包括来自一些文本框和两个列表的文本。我创建了一个具有以下代码的保存方法:
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
并表示它无法访问已关闭的文件。是什么导致此时文件被关闭?以及如何防止文件关闭?
读取时出现同样的问题,因为读取使用与写入相同的模式。
What is causing the file to be closed at this point?
您在 writeDGVrowListToBinaryFile
打给 R.Close()
的电话。你不应该用那种方法关闭作者。您几乎永远不想关闭传递给方法的文件句柄(或其他一次性资源)——通常您获取一个句柄,使用它(可能将它传递给其他方法),然后关闭它,所有这些都在同一个方法中。我还鼓励您使用 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
,所以很明显它会写入它..)
从 writeDGVrowListToBinaryFile
中删除 R.Close();
,这会导致文件提前关闭。
我在互联网上搜索并查看了很多帖子,但 none 对我有所帮助。所以我决定在这里问我自己的问题。
我在单击表单上的保存按钮时将一些数据写入二进制文件,并在从我的表单打开文件时从文件中读取该数据。数据包括来自一些文本框和两个列表的文本。我创建了一个具有以下代码的保存方法:
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
并表示它无法访问已关闭的文件。是什么导致此时文件被关闭?以及如何防止文件关闭?
读取时出现同样的问题,因为读取使用与写入相同的模式。
What is causing the file to be closed at this point?
您在 writeDGVrowListToBinaryFile
打给 R.Close()
的电话。你不应该用那种方法关闭作者。您几乎永远不想关闭传递给方法的文件句柄(或其他一次性资源)——通常您获取一个句柄,使用它(可能将它传递给其他方法),然后关闭它,所有这些都在同一个方法中。我还鼓励您使用 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
,所以很明显它会写入它..)
从 writeDGVrowListToBinaryFile
中删除 R.Close();
,这会导致文件提前关闭。