Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在读/写操作期间无法访问关闭的文件-C#_C#_Exception_Binaryreader_Binarywriter - Fatal编程技术网

在读/写操作期间无法访问关闭的文件-C#

在读/写操作期间无法访问关闭的文件-C#,c#,exception,binaryreader,binarywriter,C#,Exception,Binaryreader,Binarywriter,我在互联网上搜索过很多帖子,但没有一篇对我有帮助。所以我决定在这里问我自己的问题 单击表单上的“保存”按钮时,我正在将一些数据写入二进制文件,并在从表单打开文件时从文件中读取这些数据。数据包括一些文本框和两个列表中的文本。我创建了一个save方法,其代码如下: BinaryWriter writer = new BinaryWriter(new FileStream(savedFileName, FileMode.Create, FileAccess.Write)); write

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

单击表单上的“保存”按钮时,我正在将一些数据写入二进制文件,并在从表单打开文件时从文件中读取这些数据。数据包括一些文本框和两个列表中的文本。我创建了一个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();
        }
我有另一种编写列表的通用方法,其代码如下:

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();
        }
问题是,当代码到达
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
)和方法名(
writedVrowlistToBinaryFile
是非传统的-只需
WriteRowList
如何?它需要一个
BinaryWriter
,所以很明显它要写入它…)

删除
R.Close()
writeDGVrowListToBinaryFile
中,它会导致文件提前关闭。

所以你有一个例外,说“文件已关闭”,你甚至懒得搜索你是否关闭了文件?@Steve这就是我在问题中要问的,我不明白是什么导致文件关闭。现在我有了坚持住了。