在读写操作期间不能访问已关闭的文件

本文关键字:文件 访问 不能 读写 操作 | 更新日期: 2023-09-27 17:51:12

我在网上搜索了很多帖子,但没有一个对我有帮助。所以我决定在这里问我自己的问题。

当我的表单上的保存按钮被点击时,我正在写一些数据到二进制文件,当文件从我的表单打开时,从文件中读取该数据。数据包括来自一些文本框和两个list的文本。我已经创建了一个保存方法,其代码如下:

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并说它无法访问已关闭的文件。是什么原因导致文件在此时被关闭?我怎样才能防止文件关闭?

读取时也会出现同样的问题,因为读取和写入使用相同的模式。

在读写操作期间不能访问已关闭的文件

是什么原因导致文件在此时被关闭?

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();,这会导致文件提前关闭